技术咨询:如何基于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
相关产品推荐
相关产品推荐

