
本文介绍如何对 Pandas DataFrame 指定列进行行级聚合(如 sum/max/mean),并天然跳过 NaN 值;重点解决全 NaN 行导致的 ValueError 问题,推荐使用内置 df.agg(axis=1) 方案,兼顾简洁性、性能与鲁棒性。
本文介绍如何对 pandas dataframe 指定列进行行级聚合(如 sum/max/mean),并天然跳过 nan 值;重点解决全 nan 行导致的 `valueerror` 问题,推荐使用内置 `df.agg(axis=1)` 方案,兼顾简洁性、性能与鲁棒性。
在数据处理中,对多列执行行级(row-wise)聚合是常见需求——例如计算每行若干数值列的和、最大值或均值,并自动忽略缺失值(NaN)。虽然可通过 apply + lambda 实现,但手动处理全 NaN 行易引发异常(如 max() arg is an empty sequence),且性能欠佳。
最 Pythonic 的解决方案是直接使用 Pandas 内置的 .agg() 方法配合 axis=1:
import pandas as pd
import numpy as np
df = pd.DataFrame({
"col1": [1, np.nan, 1, np.nan],
"col2": [2, 2, np.nan, np.nan]
})
# 一次性对指定列执行多种聚合,自动跳过 NaN,全 NaN 行返回合理默认值
result = df.agg(['sum', 'max', 'mean'], axis=1)
# 注意:sum 对全 NaN 行返回 0.0(pandas 默认行为),max/mean 返回 NaN(符合语义)
df_final = df.join(result)
print(df_final)输出:
col1 col2 sum max mean 0 1.0 2.0 3.0 2.0 1.5 1 NaN 2.0 2.0 2.0 2.0 2 1.0 NaN 1.0 1.0 1.0 3 NaN NaN 0.0 NaN NaN
✅ 优势说明:
- 天然 NaN 安全:agg 在 axis=1 下对每行调用底层优化函数(如 nanmax, nanmean),全 NaN 行自动返回 NaN(max/mean)或 0(sum),无需额外异常捕获;
- 高性能:基于 Cython 实现,远快于 apply(lambda row: func(row.dropna()));
- 简洁灵活:支持字符串函数名('sum', 'max')、函数列表,甚至自定义函数(需兼容 skipna=True);
- 可扩展性强:轻松添加新聚合(如 'min', 'std'),或对不同列应用不同函数(通过字典传参)。
⚠️ 注意事项:
- 若需对 sum 也返回 NaN(而非 0)以保持语义一致性,可显式重置:
result['sum'] = result['sum'].where(df[['col1','col2']].notna().any(axis=1))
- 自定义函数须接受 Series 并支持 skipna=True(如 lambda s: s.mean(skipna=True)),否则可能失效;
- 列名需确保存在,建议前置校验:if not set(column_list).issubset(df.columns): raise ValueError(...)。
总结:避免手写 apply 循环,优先采用 df[cols].agg(func, axis=1) —— 它是 Pandas 官方推荐、经过充分测试、兼顾正确性与效率的最佳实践。

















