Pandas中DataFrame的agg()与apply()方法有何区别?
pandas DataFrame.agg() 与 DataFrame.apply() 的区别解析
问题背景
已有不少讨论针对groupby对象的agg()和apply(),但仍不清楚**DataFrame原生的agg()与apply()**的差异,从下方测试代码看二者输出完全一致,同时想了解是否存在仅适用于行操作、不适用于列操作的特殊场景。
测试代码
import pandas as pd a = pd.Series([True, False, False]) b = pd.Series([False, False, False]) c = pd.Series([True, True, False]) d = pd.Series([1, 2, 3]) print(pd.DataFrame({'a': a, 'b': b, 'c': c, 'd': d}).agg(lambda x: print(len(x)), axis=1)) print() print(pd.DataFrame({'a': a, 'b': b, 'c': c, 'd': d}).apply(lambda x: print(len(x)), axis=1))
代码输出
4 4 4 0 None 1 None 2 None dtype: object 4 4 4 0 None 1 None 2 None dtype: object
核心区别解析
虽然在简单lambda场景下两者表现一致,但它们的设计定位和能力范围有本质不同:
功能定位:
agg()是专门的聚合工具,主打多输入单输出的汇总计算(如求和、均值、计数),支持批量为不同列指定不同聚合逻辑;apply()是通用数据转换工具,可处理任意自定义逻辑,不管是聚合、转换还是复杂逐行/列计算,灵活性拉满。
批量操作能力:
agg()支持字典、列表形式的参数,实现多函数/多列的批量聚合,这是apply()做不到的:df = pd.DataFrame({'a': [1,2,3], 'b': [4,5,6]}) # 按列指定不同聚合函数 print(df.agg({'a': 'sum', 'b': 'mean'})) # 对所有列应用多个聚合函数 print(df.agg(['sum', 'mean']))返回值与性能:
agg()会返回结构化的聚合结果(如多级索引),且调用内置聚合函数时性能更优;apply()的返回值完全由自定义函数决定(标量、Series、DataFrame都可能),但因逐行/列执行逻辑,大数据集下速度更慢。
行操作的特殊场景
两者都支持axis=1(行操作)和axis=0(列操作),不存在仅适用于行操作的绝对特殊情况,但行操作时apply()的灵活性优势更突出:
agg()在行操作中更适合行内汇总(如求每行最大值、求和);apply()可处理行内复杂逻辑,比如多列条件判断、字符串拼接等,写法更直观:df = pd.DataFrame({'a': [1,2,3], 'b': [4,5,6], 'c': [7,8,9]}) # 行内条件判断 result = df.apply(lambda x: "大于" if (x['a']+x['b'])>x['c'] else "小于等于", axis=1) print(result)
内容的提问来源于stack exchange,提问作者shortorian
相关产品推荐
相关产品推荐

