持续补充
写在最前
本文主要介绍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本身,所以这里要注意匿名函数的写法。
相关内容
-
loc/iloc方法:
https://blog.csdn.net/yeshang_lady/article/details/89103572
-
cut/qcut方法:
https://blog.csdn.net/yeshang_lady/article/details/107957020
-
apply/applymap方法:
https://blog.csdn.net/yeshang_lady/article/details/103324742
-
isin方法:
https://blog.csdn.net/yeshang_lady/article/details/112207877
-
pivot_table方法:
https://blog.csdn.net/yeshang_lady/article/details/103068031
-
groupby方法:
https://blog.csdn.net/yeshang_lady/article/details/102488971
-
unique/nunique方法:
https://blog.csdn.net/yeshang_lady/article/details/105345653
-
join/merge方法:
https://blog.csdn.net/yeshang_lady/article/details/103363486
-
at_time/between_time方法:
https://blog.csdn.net/yeshang_lady/article/details/121953450