目录
写在前面
仅作个人学习与记录用。本文主要记录自己频繁用到的Pandas方法,持续记录。
1. 创建 / 保存数据框
1.1 创建数据框
一般使用read_csv()
或read_excel()
或read_json()
方法读取数据文件,读取xlsx文件需要xlrd包:
import pandas as pd
df = pd.read_csv('a.csv')
df2 = pd.read_excel('b.xlsx')
df3 = pd.read_json('c.json')
创建数据框一般使用DataFrame()
:
df = pd.DataFrame({'name': ['Alice', 'Bob', 'Charlie'], 'age': [25, 32, 18]})
1.2 保存数据框
保存成.csv
文件(一般来说index=False
,不保存索引):
df.to_csv('[path]/a.csv', sep=', ', index=False,...)
保存成excel
文件:
df.to_excel('[path]/a.xlsx', sheet_name='Sheet1', na_rep='', header=True, index=False, ...)
保存成.json
文件:
df.to_json("a.json")
2. 基于索引与选择的数据处理
2.1 有条件选取行列
选取含有NaN/空值所在行:
df1 = df[df['score'].isnull()]
选取含有特定值的行:例如按列socre
删除DataFrame中包含值'B'
和A+
的行:
df2=df[df['score'].isin(['A+','B'])]
选取含有特定值的列:利用enumerate遍历,将含有数字3的列放入列表中,即得到按要求的列的索引列表:
cols=[x for i,x in enumerate(df.columns) if df.iat[0,i]==3]
df=df[cols]
2.2 有条件删除行列
按某列删除包含NaN的行:dropna()
函数是在原DataFrame上进行修改,因此需要将修改后的结果重新赋值给DataFrame,例如按列socre
删除DataFrame中包含NaN和空值的行:
df = df.dropna(subset=['score'])
删除所有包含NaN或空值的行:
df = df.dropna() #删除所有包含NaN的行
df = df.dropna(how='all') #删除所有包含NaN和空值的行
删除含有特定值的行:通过~取反,例如按列socre
删除DataFrame中包含值'B'
和A+
的行:
df2=df[~df['score'].isin(['A+','B'])]
删除含有特定值的列:得到按要求的列的索引列表,再使用drop()
删除:
cols=[x for i,x in enumerate(df.columns) if df.iat[0,i]==3]
df=df.drop(cols,axis=1)
2.3 查找值
查找值:例如查找第4行,B
列的值:
x = df.at[4, 'B']
x = df.iloc[4].at['B']
例如查找第1行,第2列的值:
x = df.iat[1, 2]
x = df.iloc[0].iat[1]
2.4 按值查找位置
在列中找出指定值所在行的索引:如果有很多个的话可以使用函数.to_list()
,有多个要求可以使用 &
(and),|
(or),~
(not)::
a = df[(df.BoolCol==3)&(df.attr==22)].index.tolist()
# or
a = df[(df['BoolCol']==3)&(df['attr']==22)].index.tolist()
3. 进阶数据处理
3.1 数据个数统计
统计某列符合要求的元素的个数:例如统计某列元素大于某个数的个数,'A'
是要统计的列名,B
是要比较的列名,num
是目标值:
a = df['A'][df['B']>num].count()
有多个要求可以使用 &
(and),|
(or),~
(not):
a = df[(df['A'] == num1) & ~(x['B'] == num2)].count()
3.2 分组和聚合
3.2.1 分组
使用.group()
函数。注意,分组返回的结果是一个DataFrameGroupBy
对象,而不是一个DataFrame
或者Series
对象,所以,它们中的一些方法或者函数是无法直接调用的,需要按照GroupBy对象中具有的函数和方法进行调用。:
grouped = df.groupby('Gender') #依照单个列分组
grouped_muti = df.groupby(['Gender', 'Age']) #依照多个列分组
使用get_group()
函数,可以返回一个按照分组得到的DataFrame
对象。例如按照'Gender'
分组后找到'Gender'
是'Female'
的行:
df = grouped.get_group('Female').reset_index()
(.reset_index()
目的是重置数据框的索引,并使用默认索引。如果数据帧具有多重索引,则此方法可以删除一个或多个level。)
3.2.2 聚合(分组数据处理)
直接调用函数处理:DataFrameGroupBy
直接调用函数,例如max()
、count()
、std()
等,返回的结果是一个DataFrame
对象:
grouped.count() #返回不同组的行数
grouped.max()[['Age', 'Score']] #返回不同组的'Age', 'Score'列分别的最大值
grouped.mean()[['Age', 'Score']] #返回不同组的'Age', 'Score'列分别的平均值
aggregate函数处理:如果上述函数无法满足需求,也可以选择使用聚合函数aggregate()
,传递numpy或者自定义的函数。例如:
def getSum(data):
total = 0
for d in data:
total+=d
return total
grouped.aggregate(np.median) #返回不同组的各列的中位数
grouped.aggregate({'Age':np.median, 'Score':np.sum}) #返回不同组的'Age'列的中位数和'Score'列的总和
grouped.aggregate({'Age':getSum}) #调用自定义getSum函数,返回不同组的'Age'列的总和
apply函数处理:apply()
函数不同于aggregate()
函数,aggregate()
函数是对不同组的数值按组进行统一聚合操作,apply()
是对组内每个数值进行单独的一个操作:
def addOne(data):
return data + 1
df = grouped.get_group('Female').reset_index()
df['Age'] = df['Age'].apply(addOne) # 将组内'Age'列的值全部+1
df['Age'] = df['Age'].apply(int) #将组内'Age'列的值全部替换为int格式
4. 缺失值处理
4.1 直接填充统一值
df.isnull() #检查缺失值
df.fillna(0) #填充缺失值为0
4.2 其他填充方式
列均值填充:
df.fillna(df.mean())
列众数填充:
df.fillna(df.mode().iloc[0])
缺失值的前一个值填充:
df.pad(axis=0, inplace=False, limit=None)
缺失值的后一个值填充:
df.bfill(axis=0, inplace=False, limit=None)