关于Pandas中.apply与lambda用法的技术疑问
搞懂Pandas中.apply和lambda的那些疑惑
嘿,这俩组合刚开始用的时候确实容易绕晕,我来给你逐个拆解清楚!
1. .apply是批量修改所有元素还是逐列执行?
apply的执行逻辑取决于你设置的axis参数(默认是axis=0):
- 当
axis=0(默认):逐列执行。它会把每一列作为一个完整的Series对象传入你定义的函数里,函数对整列的元素进行操作,最终返回每列处理后的结果。 - 当
axis=1:逐行执行。这时候会把每一行作为一个Series传入函数,对整行元素操作。
举个实际例子:
import pandas as pd df = pd.DataFrame({'A': [1,2,3], 'B': [4,5,6]}) # 默认axis=0,逐列把每个元素乘2 result = df.apply(lambda x: x * 2) # 结果: # A B # 0 2 8 # 1 4 10 # 2 6 12 # axis=1,逐行求和 row_sum = df.apply(lambda x: x.sum(), axis=1) # 结果: # 0 5 # 1 7 # 2 9 # dtype: int64
如果想直接批量修改每个元素,其实更推荐用applymap,它才是专门针对每个元素的操作。
2. lambda x: 里的x是每个元素还是每列/每行?
这个完全和apply的axis参数绑定:
- 默认
axis=0:x代表每一列的Series对象,不是单个元素。比如你写df.apply(lambda x: x.name),会返回所有列的列名,因为x是列的Series,x.name就是列名。 axis=1:x代表每一行的Series对象。- 如果你用的是
applymap:x才是每个单独的元素,比如df.applymap(lambda x: str(x))会把每个元素转成字符串。
再举个例子验证:
# x是列的Series,打印每列的最大值 df.apply(lambda x: print(f"列{x.name}的最大值是{x.max()}")) # 输出: # 列A的最大值是3 # 列B的最大值是6
3. x.min/x.max返回的是全局最值还是各列/各行的最值?
当x是列或行的Series时,x.min()/x.max()返回的是当前x代表的列或行的最值,也就是各列/各行分别的最值。
比如:
# 求每列的最小值 col_mins = df.apply(lambda x: x.min()) # 结果: # A 1 # B 4 # dtype: int64 # 求每行的最大值 row_maxs = df.apply(lambda x: x.max(), axis=1) # 结果: # 0 4 # 1 5 # 2 6 # dtype: int64
如果想要整个DataFrame的全局最值,你可以在结果上再调用一次min/max,比如df.apply(lambda x: x.min()).min(),或者直接用df.min().min()更简洁。
内容的提问来源于stack exchange,提问作者Huzo
相关产品推荐
相关产品推荐

