Pandas合并DataFrame同ID行并保留非空字段问题
解决Pandas合并相同ID行并保留非空字段的问题
你遇到的问题是因为groupby().sum()对字符串类型的列会执行拼接操作,而不是保留非空值——这就是为什么lang字段变成了frende的原因。针对你的需求(合并相同ID的行,保留每个字段的非空值),这里有两种简洁且正确的实现方法:
方法1:使用groupby().first()(推荐)
first()方法会自动遍历每个分组内的行,对每一列提取第一个非缺失值,刚好匹配你的场景(每个字段在同一ID下只有一个非空值):
import pandas as pd x = [ {"id": 1, "title_fr": "maison", "lang": "fr"}, {"id": 1, "title_en": "house", "lang": "en"}, {"id": 1, "title_de": "hause", "lang": "de"}, ] df = pd.DataFrame(data=x) # 按id分组,保留每个字段的第一个非空值,同时让id回到列中 merged_df = df.groupby('id', as_index=False).first() print(merged_df)
输出结果:
id title_fr lang title_en title_de 0 1 maison fr house hause
方法2:自定义聚合函数(灵活适配复杂场景)
如果后续你的数据可能出现同一ID下某个字段有多个非空值的情况,可以用自定义lambda函数来处理,更灵活:
merged_df = df.groupby('id').agg( lambda col: col.dropna().iloc[0] if not col.dropna().empty else pd.NA ).reset_index()
这个逻辑是:对每个列,先删除缺失值,如果还有剩余值就取第一个,否则返回空值。
为什么sum()不行?
Pandas中sum()方法对于字符串类型的列,行为是拼接所有非空字符串,所以lang列的fr、en、de被拼接成了frende,这显然不是你想要的结果。
内容的提问来源于stack exchange,提问作者Xero
相关产品推荐
相关产品推荐

