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

如何用Pandas合并重复Name行并整合非空数据?

如何合并Pandas中重复行并填充缺失值

原始数据

NameAgeData_1Data_2
Tom10Test
Tom10Foo
Anne20Bar

预期输出

NameAgeData_1Data_2
Tom10TestFoo
Anne20Bar

尝试的代码

import pandas as pd
data = [['tom', 10, 'Test', ''], ['tom', 10, 1, 'Foo'], ['Anne', 20, '', 'Bar']]

df = pd.DataFrame(data, columns=['Name', 'Age', 'Data_1', 'Data_2'])
df = df.groupby("Name").sum()

print(df)

错误结果

Name
AnneFoo
TomBar

解决方案

你的问题核心在于groupby("Name").sum()的逻辑不匹配需求:它会对数值字段求和、错误处理字符串,且未考虑Age字段的一致性。另外测试数据中Tom的Data_1出现数值1,和原始表格的空值不符,需先统一格式。

以下是两种可行的实现方式:

方法1:自定义聚合函数处理非空值

import pandas as pd
# 修正测试数据,与原始表格对齐
data = [['Tom', 10, 'Test', ''], ['Tom', 10, '', 'Foo'], ['Anne', 20, '', 'Bar']]
df = pd.DataFrame(data, columns=['Name', 'Age', 'Data_1', 'Data_2'])

# 定义聚合逻辑:提取分组内第一个非空值,无则返回空字符串
def get_non_empty(x):
    non_empty = x[x != '']
    return non_empty.iloc[0] if not non_empty.empty else ''

# 按Name+Age分组(确保同一用户的年龄一致),对每个字段应用聚合函数
df_merged = df.groupby(['Name', 'Age'], as_index=False).agg(get_non_empty)
print(df_merged)

方法2:利用first()/last()快速提取非缺失值

如果每个分组内每个字段仅有一个非空值,可直接用first()取第一个非缺失值(或last()取最后一个):

import pandas as pd
data = [['Tom', 10, 'Test', ''], ['Tom', 10, '', 'Foo'], ['Anne', 20, '', 'Bar']]
df = pd.DataFrame(data, columns=['Name', 'Age', 'Data_1', 'Data_2'])

# 将空字符串转为pandas可识别的缺失值
df = df.replace('', pd.NA)
# 分组后提取第一个非缺失值,保留原始索引结构
df_merged = df.groupby(['Name', 'Age'], as_index=False).first()
# 可选:将缺失值换回空字符串
df_merged = df_merged.fillna('')
print(df_merged)

最终输出

Name  Age Data_1 Data_2
0   Anne   20        Bar
1    Tom   10   Test    Foo

内容的提问来源于stack exchange,提问作者Arcyde

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 15:20:42