You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对DataFrame重复列按行求和,组内有NaN则返回NaN

解决DataFrame重复列分组求和时保留NaN的问题

问题场景

有一个包含重复列(列数预先未知)的DataFrame:

aaabb
011111
11nan111

需要按行对重复列分组求和,且组内任意列对应行存在NaN时,该行求和结果返回NaN。

原代码尝试使用groupby.sum(),但默认跳过NaN导致结果不符合需求:

import numpy as np
import pandas as pd

df = pd.DataFrame([[1,1,1,1,1], [1,np.nan,1,1,1]], columns=['a','a','a','b','b'])
df = df.groupby(axis=1, level=0).sum()

得到的结果:

ab
032
122

由于GroupBy.sum没有skipna参数,min_count又因每组列数未知无法统一设置,因此需要另一种解决方案。


解决方案

使用groupby.apply()对每个列分组调用sum(skipna=False),实现需求:

import numpy as np
import pandas as pd

df = pd.DataFrame([[1,1,1,1,1], [1,np.nan,1,1,1]], columns=['a','a','a','b','b'])
result = df.groupby(axis=1, level=0).apply(lambda x: x.sum(skipna=False))
print(result)

输出结果

ab
032
1nan2

原理说明

  • groupby(axis=1, level=0)按列名分组,将所有同名列归为一组;
  • apply(lambda x: x.sum(skipna=False))对每个分组的子DataFrame执行求和,skipna=False确保只要组内该行存在NaN,求和结果就返回NaN;
  • 该方法无需提前知晓每组的列数,完全适配列数未知的场景。

内容的提问来源于stack exchange,提问作者Giuseppe La Gualano

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 14:12:26