如何在Python中合并具有相同ID列的行以生成单行
合并重复行并保留所有列非空信息
当前Excel输出(共3130行)
| P ID | T ID | C ID | Q1 | Q2 | Q3 |
|---|---|---|---|---|---|
| 318 | 495 | 00036282 | NO | ||
| 318 | 495 | 00036282 | Yes | All cost covered | |
| 319 | 496 | 00036283 | Yes | No additional costs | |
| 319 | 496 | 00036283 | Yes |
期望Excel输出(约900行)
| P ID | T ID | C ID | Q1 | Q2 | Q3 |
|---|---|---|---|---|---|
| 318 | 495 | 00036282 | NO | Yes | All cost covered |
| 319 | 496 | 00036283 | Yes | Yes | No additional costs |
已尝试方法
- 使用
drop_duplicates()删除重复项 - 按P ID分组并聚合行
- 连接相同P ID的行并保留唯一值
- 手动检查数据集(能定位问题但无法实现自动化解决)
尝试过的代码
# 按P Id分组并对数值列求和 df_FinalOutput_summed = df_FinalOutput.groupby('P Id').sum().reset_index() df_FinalOutput_summed
df_FinalOutput = df_FinalOutput.groupby('P Id').agg({ 'T Id': 'last', 'C ID': 'last', 'Q1': 'last', 'Q2': 'last', 'Q3': 'last' }).reset_index() # 重置索引 df_FinalOutput.reset_index(drop=True, inplace=True) # 显示结果 df_FinalOutput
以上代码接近需求,但仅选取每组最后一行,无法保留所有列的非空信息。
解决方案
核心思路是按P ID、T ID、C ID(这三列为唯一分组标识)分组,对每个分组的列保留非空信息。
方法1:自定义聚合函数取第一个非空值
# 定义聚合函数:提取分组内第一个非空值 def get_first_non_null(x): return x.dropna().iloc[0] if not x.dropna().empty else None # 按分组键聚合各列 df_merged = df_FinalOutput.groupby(['P ID', 'T ID', 'C ID']).agg({ 'Q1': get_first_non_null, 'Q2': get_first_non_null, 'Q3': get_first_non_null }).reset_index() # 查看合并结果 print(df_merged)
方法2:填充空值后去重(简洁版)
如果分组内的空值可通过前后行补全,可使用这种方式:
# 排序后用前后填充补全空值,再取每组第一行去重 df_merged = df_FinalOutput.sort_values(['P ID', 'T ID', 'C ID']) \ .groupby(['P ID', 'T ID', 'C ID']) \ .apply(lambda x: x.bfill().ffill().head(1)) \ .reset_index(drop=True) # 查看合并结果 print(df_merged)
两种方法均可将同一组的重复行合并为单行,完整保留所有列的非空信息,匹配期望输出。
内容的提问来源于stack exchange,提问作者JAY
相关产品推荐
相关产品推荐

