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

如何在Python中合并具有相同ID列的行以生成单行

合并重复行并保留所有列非空信息

当前Excel输出(共3130行)

P IDT IDC IDQ1Q2Q3
31849500036282NO
31849500036282YesAll cost covered
31949600036283YesNo additional costs
31949600036283Yes

期望Excel输出(约900行)

P IDT IDC IDQ1Q2Q3
31849500036282NOYesAll cost covered
31949600036283YesYesNo 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 19:52:44