Pandas:DataFrame常用方法

持续补充

写在最前

  本文主要介绍Pandas中DataFrame的常用方法。在正式介绍之前,需要先说明以下几点:

  • 从DataFrame中抽取出其中的一列形成的数据类型既可以是Series,也可以是DataFrame,具体如下图。这两种数据类型支持的方法大部分相似。但本篇主要介绍DataFrame类型支持的操作。
    在这里插入图片描述
  • DataFrame中的很多方法都包含参数axis,这个参数可以控制方法的操作方向:按行or按列(axis=0,默认值)。正文的示例中不再特意针对这个参数来对比方法效果。
  • DataFrame中的方法有很多。大部分方法从方法名称就可以推断出方法的作用,这类方法就不再详细介绍了。
  • DataFrame中的一些方法有别名,比如notnull和notna,这里只会介绍其中一个。
  • DataFrame中的一些方法已经在其他博客中介绍过,这里也不会再继续介绍。具体链接放在相关内容部分。

1 常用计算

  这里的一般计算主要包括以下几类。如下:

  • 加减乘除等计算:add(加;+)、sub(减;-)、mul(乘; *)、div\truediv(除;/)\floordiv(地板除;//)、mod(求余;%)、pow(幂计算)、rsub、rfloordiv\rtruediv\rdiv、rpow、radd、rmod、rmul。不以r开头的方法也可以直接使用对应的算术运算符来计算;
  • 累计求值计算:cumsum、cummin、cummax、cumpod;
  • 逻辑运算:eq(等于;==)、ne(不等于;!=)、le(小于等于;<=)、lt(小于;<)、ge(大于等于;>=)、gt(大于;>)、all(若全为True则为True,否则为False)、any(若有一个为True即为True);
  • 统计函数:count、sum、max、min、mean、median、mode、std、var、prod(所有值的乘积);
  • 其他计算:corr(相关性)、skew(偏度)、kurt(峰度);

举例如下:

import pandas as pd
import numpy as np
data=pd.DataFrame([[11,13],[0,20],[24,45]],columns=list('AB'))
data_1=data.cumprod()
data_2=data.ge(pd.Series({'A':10,'B':15})) #判断条件:第一列是否大于等于10,第二列是否大于等于15
data_3=data_2.all(axis=1) #如果某一行全为True,则返回True,否则返回False
data_4=data.count()
data_5=data.corr() #计算两列的相关性

其结果如下:
在这里插入图片描述

2 遍历数据

  DataFrame中与数据遍历相关的方法主要包括:items、iteritems(与items作用相同,未来版本会删除)、iterrows、itertuples(目前没看出来有什么特殊之处)。这几个方法的主要区别如下:

  • 除了itertuples()返回的数据类型为map之外,其余方法返回的数据类型均为迭代器。
  • items和iterrows返回的迭代器中的每个元素均为tuple。
  • items按列返回数据,iterrow按行返回数据。

具体用法举例如下(运算结果不展示):

data=pd.DataFrame([['A',1],['B',2]],columns=['col_1','col_2'])
for item in data.items():
    print(item)
for row in data.iterrows():
    print(row)

3 排序相关

3.1 rank方法

  DataFrame中提供了排序方法rank(),该方法返回值对应的排序名次。其主要参数如下:

参数作用
axis指定排序方向
method指定一组记录的排序方法:‘average’, ‘min’, ‘max’, ‘first’, ‘dense’
numeric_only是否只对数值型列进行排序
na_option指定空值处理方式:‘keep’, ‘top’, ‘bottom’
ascending是否升序
pct是否以百分比的形式展示排名

其用法举例如下:

import pandas as pd
data=pd.DataFrame([['A',10],['B',29],['a',19],[None,34],['A',17]],
                  columns=['col_1','col_2'])
data_1=data.rank(method='max')
data_2=data.rank(numeric_only=True,pct=True)

其结果如下:
在这里插入图片描述
下面依次对其就结果进行说明:

  • 先来看data_1中的col_2,将data中col_2列的结果从小到大排序,那么10排在第1位,17排在第2位,19排在第三位,依次类推。所以data_1中col_2列的值依次为:1、4、3、5、2;
  • 再来看data_1中的col_1,首先空值不会参与排序;其次字母是按照其对应的ascii码值进行排序的,所以A<B<a;另外,A出现两次,所以这里A最终的输出结果要使用method指定的方法来计算。在排序之后的数据中,A占据第1位和第2位,所以在method为max方法的前提下,A返回的结果为2。
  • 再来看data_2。因为这里设置了numeric_only,所以col_1列并不进行排序,其次,pct为True,所以col_2列返回的是其排序对应的百分比。其百分比的计算公式为:排序值/max(排序值)
3.2 idxmax/idxmin方法

  idxmax()/idxmin()方法可以返回最大值、最小值对应的索引。具体用法举例如下:

import pandas as pd
data=pd.DataFrame([['A',10,False],['B',29,False],['a',19,True],[None,34,True],['A',17,True]],
                  columns=['col_1','col_2','col_3'],
                  index=['A0','A1','A2','A3','A4'])
data_1=data[['col_2','col_3']].idxmax()
data_2=data[['col_2','col_3']].idxmin()

其结果如下:
在这里插入图片描述
这里有以下几点需要说明:

  • idxmax()\idxmin()方法支持的数据类型有:int,float和boolean。所以若针示例中的data直接运行data.idxmax()或data.idxmin()的话,会报错:TypeError: reduction operation ‘argmax’ not allowed for this dtype。
  • 对于boolean类型数据,True>False
  • 若最大值有多个,则返回最大值第一次出现时对应的索引值。
3.3 nlargest/nsmallest方法

  nlargest()/nsmallest()方法可以返回最大最小的 k k k个值。主要包括以下三个参数:

参数作用
n返回的项数
columns指定排序的一个或多个列名
keep如何处理重复值。可选值:last、first、all

其用法举例如下:

import pandas as pd
data=pd.DataFrame([['A',10,False],['A',10,False],['a',19,True],[None,17,True],['A',17,True]],
                  columns=['col_1','col_2','col_3'],
                  index=['A0','A1','A2','A3','A4'])
data_1=data.nsmallest(n=3,columns=['col_2'],keep='all')
data_2=data.nlargest(n=4,columns=['col_3'],keep='first')

其结果如下:
在这里插入图片描述
这里有以下几点需要说明:

  • columns参数指定的排序列可以是数值型及布尔型,但不能接收字符串类型。
  • keep在什么时候才会发挥作用?从data_1的结果可以发现,当按照col_2列的值选取最小的3个项时,第3项对应的col_2值为17,而data中col_2值为17的项有两个(索引为A3和A4),keep参数可以控制是A3还是A4返回给data_1。当keep=‘first’时,A3返回给data_1,当keep='last’时,A4返回给data_1,当keep='all’时,所有都返回给data_1。

4 其他

1. add_prefix()\add_suffix()方法

  这两个方法可以给DataFrame的列名添加统一的前后缀。具体用法如下:

import pandas as pd
dt=pd.DataFrame([['A',1],['B',1]],columns=['A','B'])
dt1=dt.add_prefix('Col_') #给列名增加统一的前缀
dt2=dt.add_suffix('_Col') #给列名添加统一的后缀

dt、dt1、dt2的结果分别如下:
在这里插入图片描述

2. align()数据对齐

  Pandas执行运算时,会先按照索引进行对齐,对齐以后再进行相应的运算,没有对齐的位置一般会用NaN进行补齐。Pandas提供了专门的方法align()对两个DataFrame进行数据对齐。该方法中的主要参数如下:

参数作用
other可以是DataFrame或者Series。
join对齐方式:‘outer’(默认值), ‘inner’, ‘left’, ‘right’
axis对齐方向:取值为0时按索引对齐,取值为1时按列进行对齐,不设置该值时行和列同时对齐
level
fill_value填充值,默认为np.nan
method值的填充方式
limit向前向后填充NaN值的数量
fill_axis
broadcast_axis

用法举例如下:

import pandas as pd
dt1=pd.DataFrame(np.arange(8).reshape(4,2),columns=['A','B'],index=[1,2,3,4])
dt2=pd.DataFrame(np.arange(12).reshape(4,3),columns=['A','B','C'],index=[1,2,'a','b'])
left,right=dt1.align(dt2,join='inner')
left_1,right_1=dt1.align(dt2,join='outer',fill_value=100)
left_2,right_2=dt1.align(dt2,join='outer',method='backfill',limit=1)

dt1和dt2的结果如下:
在这里插入图片描述
left、right的结果如下:当join为inner时,会在两个方向上同时求交集(因为没有指定axis)。
在这里插入图片描述
left_1、right_1的结果如下:使用100填充没有对齐的位置。
在这里插入图片描述
left_2、right_2的结果如下:
在这里插入图片描述

3. asfreq()

  asfreq()方法可以把时间序列型的索引(即DatetimeIndex型、PeriodIndex型)转化到特定的时间频率。具体用法举例如下:

import pandas as pd
idx1=pd.date_range(start='2022-07-25',end='2022-07-26',freq='D')
idx2=pd.period_range(start='2022-07-25',end='2022-07-26',freq='D')
dt1=pd.DataFrame([[1,2],[3,4]],columns=['A','B'],index=idx1)
dt2=pd.DataFrame([[1,2],[3,4]],columns=['A','B'],index=idx2)

dt1和dt2的结果如下:
在这里插入图片描述
当对这两个DataFrame变量进行asfreq操作后得到的结果如下:

  • 当DataFrame的索引为DatetimeIndex类型时,新的索引是利用pd.date_range()方法利用asfreq()方法中的指定的freq重新生成的,新出现的索引对应的值会用空值进行填充。
    在这里插入图片描述
  • 当DataFrame的索引为PeriodIndex类型时,新索引和旧索引是一对一的关系。
    在这里插入图片描述
4. asof()

  asof()方法返回指定索引(包含该索引)之前最后一行在指定列不含空值的数据。 具体用法如下:
在这里插入图片描述
使用asof()方法要注意以下几点:

  • DataFrame或Series必须是已经排序的。
  • 未指定subset是会对DataFrame的所有列进行非空判断。
5. assign()

  给DataFrame分配新列。具体如下:
在这里插入图片描述
这里要注意assign()中匿名函数中的x为dt本身,所以这里要注意匿名函数的写法。

相关内容

  1. loc/iloc方法:https://blog.csdn.net/yeshang_lady/article/details/89103572
  2. cut/qcut方法:https://blog.csdn.net/yeshang_lady/article/details/107957020
  3. apply/applymap方法:https://blog.csdn.net/yeshang_lady/article/details/103324742
  4. isin方法:https://blog.csdn.net/yeshang_lady/article/details/112207877
  5. pivot_table方法:https://blog.csdn.net/yeshang_lady/article/details/103068031
  6. groupby方法:https://blog.csdn.net/yeshang_lady/article/details/102488971
  7. unique/nunique方法:https://blog.csdn.net/yeshang_lady/article/details/105345653
  8. join/merge方法:https://blog.csdn.net/yeshang_lady/article/details/103363486
  9. at_time/between_time方法:https://blog.csdn.net/yeshang_lady/article/details/121953450
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值