You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:57:44