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

技术咨询:如何基于ID列值合并DataFrame中的重复行并整合非空数据

合并重复ID行的解决方案(Pandas)

嘿,这个需求用pandas处理起来超简单!我给你两个靠谱的方案,都能完美解决你的问题——不管你的数据里每个ID出现几次,只要同一个ID的非空值是统一的,就能得到你想要的合并结果。

首先,先模拟你提到的包含字符型+数值型、每个ID出现4次的数据集:

import pandas as pd
import numpy as np

# 构造符合你场景的示例DataFrame
df = pd.DataFrame({
    'ID-No': [1, 1, 1, 1, 2, 2, 2, 2],
    'cigsaday': [np.nan, np.nan, 5, 5, np.nan, np.nan, 5, 5],
    'activity': [1, 1, np.nan, np.nan, 1, 1, np.nan, np.nan],
    'char_column': ['smoker', 'smoker', np.nan, np.nan, 'smoker', 'smoker', np.nan, np.nan]
})

方法1:用groupby + first()快速合并

这是最简洁的方案,first()方法会自动跳过NA值,取每个分组内的第一个非空值——刚好匹配你的场景,因为同一个ID的非空值都是一致的:

# 按ID-No分组,保留每个列的第一个非空值,同时不把ID设为索引
merged_df = df.groupby('ID-No', as_index=False).first()

运行后得到的merged_df就是你想要的结构:

ID-No  cigsaday  activity char_column
0      1       5.0         1      smoker
1      2       5.0         1      smoker

方法2:自定义聚合函数(更灵活)

如果后续你有特殊需求(比如某些列需要不同的处理逻辑),可以自定义一个取非空值的函数,用agg()来聚合:

# 自定义函数:返回分组内第一个非空值
def get_valid_value(series):
    # 先删掉NA,再取第一个元素
    return series.dropna().iloc[0]

merged_df = df.groupby('ID-No', as_index=False).agg(get_valid_value)

这个方法和结果和方法1完全一致,但扩展性更强——比如你可以给不同的列指定不同的处理函数。

注意事项

  • 确保同一个ID的同一列中,所有非空值都是相同的,否则first()会取第一个出现的非空值;
  • 这个方案同时支持数值型和字符型列,不需要单独处理数据类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 09:47:37