如何用Pandas合并重复Name行并整合非空数据?
如何合并Pandas中重复行并填充缺失值
原始数据
| Name | Age | Data_1 | Data_2 |
|---|---|---|---|
| Tom | 10 | Test | |
| Tom | 10 | Foo | |
| Anne | 20 | Bar |
预期输出
| Name | Age | Data_1 | Data_2 |
|---|---|---|---|
| Tom | 10 | Test | Foo |
| Anne | 20 | Bar |
尝试的代码
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 | |
|---|---|
| Anne | Foo |
| Tom | Bar |
解决方案
你的问题核心在于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
相关产品推荐
相关产品推荐

