百日筑基篇——Pandas学习三(pyhton入门八)
文章目录
- 前言
- 一、数据排序
- 二、字符串处理
- 三、数据合并方法
- 1. merge方法
- 2. concat方法
- 四、分组数据统计
- 五、数据重塑
- 1. stack
- 2. pivot
- 总结
前言
上一篇文章介绍了一下pandas库中的一些函数,而本章则继续介绍库中的函数在数据处理中的应用。
一、数据排序
运用sort_values方法,
import pandas as pd
path = 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 pd
df1 = 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 pd
df1 = 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.000000
df4 = 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 筑基篇