Pandas知识点-详解行列级批处理函数apply

Pandas知识点-详解行列级批处理函数apply

在Pandas中,DataFrame和Series等对象需要执行批量处理操作时,可以借用apply()函数来实现。
apply()的核心功能是实现”批量”调度处理,至于批量做什么,由用户传入的函数决定(自定义或现成的函数)。函数传递给apply(),apply()会帮用户在DataFrame和Series等对象中(按行或按列)批量执行传入的函数。
先看一个例子:


import pandas as pd

df = pd.DataFrame({'Col-1': [1, 3, 5], 'Col-2': [2, 4, 6], 'Col-3': [9, 8, 7], 'Col-4': [3, 6, 9]},
                  index=['A', 'B', 'C'])
print(df)
df_new = df.apply(lambda x: x-1)
print('-' * 30, '\n', df_new, sep='')
   Col-1  Col-2  Col-3  Col-4
A      1      2      9      3
B      3      4      8      6
C      5      6      7      9
Col-1    5
Col-2    6
Col-3    9
Col-4    9
dtype: int64
Col-1    1
Col-2    2
Col-3    7
Col-4    3
dtype: int64
def make_ok(s):
    return pd.Series(['{}ok'.format(d) for d in s])

df4 = df.apply(make_ok)
print('-' * 30, '\n', df4, sep='')
   Col-1  Col-2  Col-3  Col-4
0  1ok-列  2ok-列  9ok-列  3ok-列
1  3ok-列  4ok-列  8ok-列  6ok-列
2  5ok-列  6ok-列  7ok-列  9ok-列
   Col-1  Col-2  Col-3  Col-4
A  1-yes  2-yes  9-yes  3-yes
B  3-yes  4-yes  8-yes  6-yes
C  5-yes  6-yes  7-yes  9-yes
   Col-1  Col-2  Col-3  Col-4
0  1-yes  2-yes  9-yes  3-yes
1  3-yes  4-yes  8-yes  6-yes
2  5-yes  6-yes  7-yes  9-yes

在apply()中,func函数的第一个参数默认会传入Series对象,这就是前面说的”将列/行作为Series对象传递给函数”,因此函数func至少要有一个参数,这个参数相当于类方法中的self,不需要在args中传值。如果func没有参数,则不能在apply中使用。
如果func的参数多于一个,则多出来的参数通过args传递,args接收一个元组,args里只有一个值时,需要加上逗号。如果func中有关键字参数,可以传到apply中kwds的位置。
传入多个函数进行聚合**

df10 = df.apply([np.max, np.min])
print('-' * 40, '\n', df10, sep='')
df11 = df.apply({'Col-1': np.mean, 'Col-2': np.min})
print('-' * 40, '\n', df11, sep='')
df12 = df.apply({'Col-1': [np.mean, np.median], 'Col-2': [np.min, np.mean]})
print('-' * 40, '\n', df12, sep='')
Col-1    3.0
Col-2    2.0
dtype: float64
A    3.75
B    5.25
C    6.75
dtype: float64
   Col-1  Col-2  Col-3  Col-4 Col-x
A      1      2      9      3   1ok
B      3      4      8      6   3ok
C      5      6      7      9   5ok
A    2ok
B    4ok
C    6ok
Name: Col-2, dtype: object
a    0ok
b    1ok
c    2ok
d    3ok
e    4ok
dtype: object

DataFrame中的一行或一列都是一个Series,所以用DataFrame的列或行调用apply()就相当于Series调用apply()。
在DataFrame中,apply()将行/列作为Series传给func函数,在Series中,apply()将Series中的每一个值传给func函数。对于这两种情况,func接受的参数类型完全不一样,因此使用时一定要注意func函数的参数类型,否则可能不适用。

s2 = s.apply(np.mean)
print('-' * 20, '\n', s2, sep='')
s3 = np.mean(s)
print('-' * 20, '\n', s3, sep='')
2.0

将Series中的每一个值传给apply()中的函数func,返回的结果仍然是一个Series。将Series作为一个整体传给apply()中的函数func,有些函数返回的结果仍然是Series,如上面的自定义函数,有些函数返回的结果不再是Series,而是一个其他类型的数据,如numpy中的统计运算函数(mean、max、min)等。
因此DataFrame经过apply()批处理后,可能会变成一个Series,这是由apply()中的函数func的返回值决定的,与apply()无关。
以上就是pandas中的apply()函数的用法介绍和分析,希望对你有帮助,想要深入的了解apply()函数的底层原理,可以打个断点,在”Debugger”模式中看运行过程,也可以看源码。如果你有其他的想法或疑问,欢迎加我好友一起交流讨论。

参考文档:
[1] pandas中文网:https://www.pypandas.cn/docs/

Original: https://blog.csdn.net/weixin_43790276/article/details/125532026
Author: 小斌哥ge
Title: Pandas知识点-详解行列级批处理函数apply

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/751394/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球