百日筑基篇——Pandas學習三(pyhton入門八)
文章目錄
- 前言
- 一、數據排序
- 二、字符串處理
- 三、數據合并方法
- 1. merge方法
- 2. concat方法
- 四、分組數據統計
- 五、數據重塑
- 1. stack
- 2. pivot
- 總結
前言
上一篇文章介紹了一下pandas庫中的一些函數,而本章則繼續介紹庫中的函數在數據處理中的應用。
一、數據排序
運用sort_values方法,
import pandas as pdpath = r"C:\Users\王浩天\Desktop\beijing_tianqi_2018.csv"
df = pd.read_csv(path)
df.loc[:, "bWendu"] = df["bWendu"].str.replace("℃", "").astype("int32")
df.loc[:, "yWendu"] = df["yWendu"].str.replace("℃", "").astype("int32")print(df.head(4))
#Series的排序
print(df["bWendu"].sort_values(ascending=True,inplace=False))
#DataFrame的排序
df1 = df.sort_values(by=["aqiLevel","bWendu"],ascending=[True,False],inplace=False)
print(df1.head(6))ymd bWendu yWendu tianqi fengxiang fengli aqi aqiInfo aqiLevel
178 2018-06-28 35 24 多云~晴 北風 1-2級 33 優 1
149 2018-05-30 33 18 晴 西風 1-2級 46 優 1
206 2018-07-26 33 25 多云~雷陣雨 東北風 1-2級 40 優 1
158 2018-06-08 32 19 多云~雷陣雨 西南風 1-2級 43 優 1
205 2018-07-25 32 25 多云 北風 1-2級 28 優 1
226 2018-08-15 32 24 多云 東北風 3-4級 33 優 1
在數據框的排序中,sort_values()函數的參數"by"用來指定根據排序的列名,“ascending” 參數則填布爾值或由布爾值形成的列表,用來指定是升序還是降序 ,且與"by"一一對應。
列如,在上述代碼中,是先根據"aqiLevel"升序排序,再在此基礎上按"bWendu"來降序排序。
二、字符串處理
使用 .str方法,獲取Series的str屬性,以便在屬性上調用所需函數。
#使用str的startswith 、contains 等得到bool的Series,可以用來做條件查詢
#例如,提取出六月份的數據
condition = df["ymd"].str.startswith("2018-06")
print(df.loc[condition,:])#多次str處理,只展示月份
df1["ymd"]=df1["ymd"].str.replace("-","").str[4:6]
print(df1.head(3))ymd bWendu yWendu tianqi fengxiang fengli aqi aqiInfo aqiLevel
178 06 35 24 多云~晴 北風 1-2級 33 優 1
149 05 33 18 晴 西風 1-2級 46 優 1
206 07 33 25 多云~雷陣雨 東北風 1-2級 40 優 1#使用split對ymd進行拆分為列表
def func(df):year,month,day = df["ymd"].split("-")return f"{year}年{month}月{day}日"
df["日期"] = df.apply(func,axis=1)
print(df.head(3))ymd bWendu yWendu tianqi ... aqi aqiInfo aqiLevel 日期
0 2018-01-01 3 -6 晴~多云 ... 59 良 2 2018年01月01日
1 2018-01-02 2 -5 陰~多云 ... 49 優 1 2018年01月02日
2 2018-01-03 2 -5 多云 ... 28 優 1 2018年01月03日#若要將年月日去掉,可使用正則表達式
df["日期"]=df["日期"].str.replace("[年月日]","",regex = True)
print(df.head(2))
三、數據合并方法
1. merge方法
根據一列或多列的值將兩個DataFrame對象按行或列合并到一起
import pandas as pddf1 = pd.DataFrame({'學號': ['A0', 'A1', 'A2', 'A3'],'姓名': ['B0', 'B1', 'B2', 'B3'],'學生': ['K0', 'K1', 'K2', 'K3']})df2 = pd.DataFrame({'成績': ['C0', 'C1', 'C2', 'C3'],'導師': ['D0', 'D1', 'D2', 'D3'],'學生': ['K0', 'K1', 'K2', 'K3']})print(df1)
print(df2)
df_merge = pd.merge(df1,df2,on="學生")
print(df_merge)學號 姓名 學生 成績 導師
0 A0 B0 K0 C0 D0
1 A1 B1 K1 C1 D1
2 A2 B2 K2 C2 D2
3 A3 B3 K3 C3 D3
筆記如下:
2. concat方法
用于按行或列將多個DataFrame對象連接到一起。它可以用于沿著行或列軸將DataFrame對象堆疊在一起
import pandas as pddf1 = pd.read_csv(r"D:\python\PycharmProjects\pythonProject1\pachou\result_dir\yaxibao0.csv",encoding="utf-8")
df2 = pd.read_csv(r"D:\python\PycharmProjects\pythonProject1\pachou\result_dir\yaxibao1.csv",encoding="utf-8")
df1 = pd.DataFrame(df1)
df2 = pd.DataFrame(df2)
#print(df1)
#print(df2)
DF= pd.concat([df1,df2],axis=0) #默認按行合并
print(DF)AA_ID yaxibao
0 LaggChr1G00000010.1 chlo
1 LaggChr1G00000020.1 cyto
2 LaggChr1G00000030.1 nucl
3 LaggChr1G00000040.1 nucl
4 LaggChr1G00000050.1 mito
.. ... ...
533 LaggChr1G00010360.1 nucl
534 LaggChr1G00010370.1 cyto
535 LaggChr1G00010380.1 cyto
536 LaggChr1G00010390.1 chlo
537 LaggChr1G00010400.1 plas[1040 rows x 2 columns]
筆記如下:
四、分組數據統計
主要運用groupby方法,通常與agg()方法聯用。也可以自定義方法,并使用apply應用于數據框
import numpy as np
df["ymd"] = df["ymd"].str[:7]
print(df.head(3)ymd bWendu yWendu tianqi fengxiang fengli aqi aqiInfo aqiLevel
0 2018-01 3 -6 晴~多云 東北風 1-2級 59 良 2
1 2018-01 2 -5 陰~多云 東北風 1-2級 49 優 1
2 2018-01 2 -5 多云 北風 1-2級 28 優 1#可傳入多個分組依據列;as_index=False ,表示不使分組列變為索引,后面的agg函數,傳入字典可對不同的列使用指定的聚合方法
print(df.groupby(["fengxiang","ymd"],as_index=False).agg({"bWendu":np.max,"yWendu": np.min,"aqi": np.mean}))fengxiang ymd bWendu yWendu aqi
0 東北風 2018-01 3 -11 45.200000
1 東北風 2018-02 10 -4 45.000000
2 東北風 2018-03 15 -4 141.666667
3 東北風 2018-04 19 1 56.200000
4 東北風 2018-05 25 13 121.000000
.. ... ... ... ... ...
68 西南風 2018-12 2 -8 78.000000
69 西風 2018-02 8 -4 78.000000
70 西風 2018-05 33 10 74.500000
71 西風 2018-07 27 23 28.000000
72 西風 2018-10 21 7 77.000000df4 = df[["ymd","bWendu","yWendu","aqi","aqiLevel"]]
print(df4.groupby("ymd").agg([np.sum,np.mean,np.std]))
print(df4.groupby("ymd").agg({"bWendu":np.max,"yWendu": np.min,"aqi": np.mean}))#使用自定義方法
def guiyihua(df):df["bWendu_new"] = df["bWendu"].apply(lambda x: (x - df["bWendu"].min())/ (df["bWendu"].max() - df["bWendu"].min()))return df
print(df.groupby("ymd").apply(guiyihua))
五、數據重塑
這里是引用
1. stack
stack函數用于將數據框的列轉換為行,從而生成一個新的數據框
它會將數據框的列標簽轉換為新的索引層級,并將對應的值放入新的列中。這個過程被稱為"堆疊"。
unstack是與stack相反的操作,用于將行索引轉換為列。
#print(df.dtypes)
df["ymd"] = pd.to_datetime(df["ymd"])
#print(df.dtypes)
#根據月份分組
df_group = df.groupby([df["ymd"].dt.month,"fengxiang"])["bWendu"].agg(pv = np.max)
print(df_group)pv
ymd fengxiang
1 東北風 3東南風 2東風 3北風 2南風 7
... ..
11 西南風 14
12 東北風 9東南風 7西北風 10西南風 2[73 rows x 1 columns]#將行索引轉化為列
df_stack = df_group.unstack()
print(df_stack)pv
fengxiang 東北風 東南風 東風 北風 南風 西北風 西南風 西風
ymd
1 3.0 2.0 3.0 2.0 7.0 6.0 5.0 NaN
2 10.0 NaN 7.0 6.0 8.0 5.0 12.0 8.0
3 15.0 14.0 25.0 18.0 27.0 NaN 25.0 NaN
4 19.0 26.0 NaN 26.0 30.0 26.0 27.0 NaN
5 25.0 28.0 29.0 25.0 35.0 31.0 32.0 33.0
6 37.0 37.0 36.0 35.0 37.0 NaN 38.0 NaN
7 33.0 37.0 32.0 32.0 35.0 NaN 35.0 27.0
8 32.0 35.0 35.0 32.0 36.0 NaN 28.0 NaN
9 NaN NaN NaN 30.0 29.0 27.0 31.0 NaN
10 17.0 NaN NaN 25.0 25.0 24.0 19.0 21.0
11 8.0 13.0 NaN 15.0 18.0 11.0 14.0 NaN
12 9.0 7.0 NaN NaN NaN 10.0 2.0 NaN#將列索引轉換為行
ymd fengxiang
1 東北風 pv 3東南風 pv 2東風 pv 3北風 pv 2南風 pv 7..
11 西南風 pv 14
12 東北風 pv 9東南風 pv 7西北風 pv 10西南風 pv 2
Length: 73, dtype: int32
2. pivot
pivot函數會重新安排數據框的行和列,使之對應于新的行和列標簽。這個過程被稱為"旋轉"
import pandas as pd# 創建一個簡單的數據框
data = {'Name': ['wht', 'xingshi'],'Subject': 'Maths','Score': [90, 85]}
df = pd.DataFrame(data)
print(df)Name Subject Score
0 wht Maths 90
1 xingshi Maths 85# 使用pivot函數進行數據重塑
pivoted_df = df.pivot(index='Name', columns='Subject', values='Score')# 打印重塑后的數據框
print(pivoted_df)
Subject Maths
Name
wht 90
xingshi 85
總結
本章主要總結了有關pandas庫中的一些函數,有排序函數sort_values; 數據合并函數merge、concat;分組統計函數groupby;以及數據重塑函數stack、pivot。
子非魚,安知魚之樂;
–2023-8-14 筑基篇