如何优化Pandas分组拼接列并填充组内NaN为公共值的代码?
问题:按分组拼接列并填充组内NaN值
输入数据 df1
A B C D E F G Messi Forward Argentina 1 Nan 5 6 Ronaldo Defender Portugal Nan 4 Nan 3 Messi Midfield Argentina Nan 5 Nan 6 Ronaldo Forward Portugal 3 Nan 2 3 Mbappe Forward France 1 3 2 5
预期输出 df
A B C D E F G Messi Forward,Midfield Argentina 1 5 5 6 Ronaldo Forward,Defender Portugal 3 4 2 3 Mbappe Forward France 1 3 2 5
当前尝试代码
df.groupby(['A','C'])['B'].agg(','.join).reset_index() df.fillna(method='ffill')
需求说明
按A、C列分组,拼接B列的所有取值;同时将D、E、F、G列中的NaN填充为组内的公共有效值(组内非NaN的唯一值)。
更优实现方式
可以通过一次groupby聚合操作完成所有需求,避免多次处理数据框:
import pandas as pd # 假设已加载输入数据到df1 df_result = df1.groupby(['A', 'C'], as_index=False).agg( # 拼接B列的取值 B=('B', ','.join), # 对其他列取组内第一个非NaN值(组内有效值唯一) D=('D', lambda x: x.dropna().iloc[0]), E=('E', lambda x: x.dropna().iloc[0]), F=('F', lambda x: x.dropna().iloc[0]), G=('G', lambda x: x.dropna().iloc[0]) )
说明
- 这种方式将分组拼接和NaN填充合并为一步操作,效率更高,逻辑更清晰。
- 由于D/E/F/G列在每个分组内的有效值是唯一的,所以通过
dropna()过滤NaN后取第一个值即可得到组内公共值。
内容的提问来源于stack exchange,提问作者AB14
相关产品推荐
相关产品推荐

