解决Pandas DataFrame分组聚合列表列插入后值为NaN的问题
问题:按'Melder'分组生成'SAG-Nummer'列表并添加为DataFrame新列失败
我尝试按Melder字段分组,生成对应SAG-Nummer的列表,再将该列表作为新列添加到原DataFrame中,但使用apply(list)配合insert()时无法正常工作。
现有代码及现象
- 以下代码可生成仅包含分组值的新Series:
new_df2 = new_df.groupby('Melder')['SAG-Nummer'].apply(list)
- 但使用
insert()添加列时,新列所有值均为NaN:
my_df.insert(1,'Liste',my_df.groupby('Melder')['SAG-Nummer'].apply(list)) print(my_df)
输出结果:
SAG-Nummer Liste Melder 0 SAG-2001-0389 NaN Meyer 1 SAG-2001-0388 NaN Meyer 2 SAG-2001-1833 NaN Schmidt 3 SAG-2001-1836 NaN Berg
而分组后的new_df2输出是正常的:
print(new_df2)
输出:
Melder Berg [SAG-2001-1836] Meyer [SAG-2001-0389, SAG-2001-0388] Schmidt [SAG-2001-1833]
预期结果
SAG-Nummer Liste Melder 0 SAG-2001-0389 [SAG-2001-0389, SAG-2001-0388] Meyer 1 SAG-2001-0388 [SAG-2001-0389, SAG-2001-0388] Meyer 2 SAG-2001-1833 [SAG-2001-1833] Schmidt 3 SAG-2001-1836 [SAG-2001-1836] Berg
解决方案
问题出在索引不匹配:groupby().apply(list)返回的Series以Melder的值为索引,而原DataFrame用的是默认数字索引,直接插入会因索引无法对应导致赋值为NaN。
改用transform()替代apply()即可解决,transform()会将分组结果广播到原DataFrame的每一行,保持索引一致:
直接添加新列
my_df['Liste'] = my_df.groupby('Melder')['SAG-Nummer'].transform(list)
指定位置插入新列
# 先计算分组后的列表列 liste_col = my_df.groupby('Melder')['SAG-Nummer'].transform(list) # 在第2列(索引1)插入新列 my_df.insert(1, 'Liste', liste_col)
运行上述代码后,即可得到预期的结果。
内容的提问来源于stack exchange,提问作者Roland
相关产品推荐
相关产品推荐

