Pandas按多列分组并依据分类值求和,保留空值问题
解决Pandas分组时保留type列空值记录的问题
你的问题核心是错误地仅按name单字段分组,且聚合type时用了取众数的逻辑,导致type为空的记录被合并丢失。正确的做法是按name和type(包含空值)共同分组,具体实现如下:
解决方案代码
import pandas as pd # 构造原始数据 data = { 'name': ['AA', 'AA', 'AA', 'AA', 'BB', 'BB', 'BB', 'BB'], 'size': [9385, 9460, 9572, 9680, 10, 10, 20, 20], 'type': ['FALSE', 'FALSE', 'TRUE', pd.NA, 'TRUE', 'TRUE', 'FALSE', 'FALSE'] } df = pd.DataFrame(data) # 按name和type分组(保留空值分组),对size求和 result = df.groupby(['name', 'type'], dropna=False)['size'].sum().reset_index() # 将空值转为空字符串,匹配期望结果格式 result['type'] = result['type'].fillna('') print(result)
代码说明
groupby(['name', 'type'], dropna=False):dropna=False是关键配置,它会把type列的空值(NaN)作为独立分组保留,不会被过滤。- 直接对
size求和,避免了原代码中聚合type时的众数逻辑,确保每个name+type组合(包括空type)都能得到对应的size总和。 fillna('')将Pandas的NaN转为空字符串,和你给出的期望结果格式完全一致。
输出结果
name size type 0 AA 9572 TRUE 1 AA 18845 FALSE 2 AA 9680 3 BB 20 TRUE 4 BB 40 FALSE 5 BB NaN
(注:最后一行的size为NaN是因为原始数据中BB没有对应空type的size记录,与你的期望结果一致)
内容的提问来源于stack exchange,提问作者Lynn
相关产品推荐
相关产品推荐

