本文介绍如何对 Pandas DataFrame 的指定列进行行级聚合(如 sum、max、mean),自动跳过 NaN 值,并优雅处理全 NaN 行,避免空序列报错。推荐使用内置 df.agg(..., axis=1) 方法,兼具简洁性、性能与鲁棒性。
本文介绍如何对 pandas dataframe 的指定列进行行级聚合(如 sum、max、mean),自动跳过 nan 值,并优雅处理全 nan 行,避免空序列报错。推荐使用内置 `df.agg(..., axis=1)` 方法,兼具简洁性、性能与鲁棒性。
在数据分析中,对多列执行行级(row-wise)聚合是常见需求,例如计算每行若干数值列的和、最大值或均值。但手动用 apply + lambda 实现时,容易在遇到全 NaN 行时抛出 ValueError: max() arg is an empty sequence 等异常——因为 Python 内置函数(如 max, sum, min)不接受空序列,而 pandas.Series.mean() 等虽返回 NaN,却无法统一适配所有聚合逻辑。
最佳实践是直接利用 Pandas 原生支持的 DataFrame.agg 方法,它专为向量化聚合设计,天然支持 axis=1(按行)、自动忽略 NaN(除 sum 默认为 0 外,其余如 max/mean 在全 NaN 行返回 NaN),且无需额外错误处理:
import pandas as pd
import numpy as np
df = pd.DataFrame({
"col1": [1.0, np.nan, 1.0, np.nan],
"col2": [2.0, 2.0, np.nan, np.nan]
})
# 对指定列执行多种行级聚合(仅作用于 col1 和 col2)
result = df[["col1", "col2"]].agg(["sum", "max", "mean"], axis=1)
# 合并回原 DataFrame
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
✅ 关键优势说明:
- agg(..., axis=1) 是向量化操作,性能远超 apply(lambda row: ...);
- sum 在全 NaN 行默认返回 0.0(符合数学直觉,也可通过 min_count=1 改为 NaN);
- max/min/mean 等自动返回 NaN,无需 try-except 或自定义 fallback;
- 支持任意可调用对象(包括自定义函数),只要其能接收 pd.Series 并返回标量;
- 可灵活指定列子集(如 df[cols].agg(...)),避免污染无关列。
⚠️ 注意事项:
- 若需 sum 在全 NaN 行也返回 NaN(而非 0.0),显式传入 min_count=1:
df[["col1","col2"]].agg({"sum": ("sum", {"min_count": 1}), "max": "max"}, axis=1) - 自定义函数需兼容 Series.dropna() 后为空的情况(例如 lambda s: s.max() if not s.empty else np.nan),但通常优先选用内置聚合名(如 "max")以获得最优行为;
- 避免混用 Python 内置函数(如 sum, max)与 axis=1 的原始 apply,因其缺乏 NaN 意识,易崩溃。
综上,df[columns].agg(aggs, axis=1) 是最 Pythonic、最健壮、最高效的行级聚合方案——它将数据完整性、代码可读性与工程可靠性融为一体,是 Pandas 高级用法的典范实践。










