【杂记】Pandas常用函数与技巧整理


写在前面

仅作个人学习与记录用。本文主要记录自己频繁用到的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)
  • 22
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值