如何对DataFrame重复列按行求和,组内有NaN则返回NaN
解决DataFrame重复列分组求和时保留NaN的问题
问题场景
有一个包含重复列(列数预先未知)的DataFrame:
| a | a | a | b | b | |
|---|---|---|---|---|---|
| 0 | 1 | 1 | 1 | 1 | 1 |
| 1 | 1 | nan | 1 | 1 | 1 |
需要按行对重复列分组求和,且组内任意列对应行存在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()
得到的结果:
| a | b | |
|---|---|---|
| 0 | 3 | 2 |
| 1 | 2 | 2 |
由于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)
输出结果
| a | b | |
|---|---|---|
| 0 | 3 | 2 |
| 1 | nan | 2 |
原理说明
groupby(axis=1, level=0)按列名分组,将所有同名列归为一组;apply(lambda x: x.sum(skipna=False))对每个分组的子DataFrame执行求和,skipna=False确保只要组内该行存在NaN,求和结果就返回NaN;- 该方法无需提前知晓每组的列数,完全适配列数未知的场景。
内容的提问来源于stack exchange,提问作者Giuseppe La Gualano
相关产品推荐
相关产品推荐

