如何基于ID合并Pandas DataFrame行并保留唯一值为列表
Pandas按ID合并行:同一ID下唯一值转列表、重复值保留单个
针对你的需求,这里给你一套适合新手的实现步骤,代码直接就能跑:
1. 先构造示例数据
先把你给的原始数据用Pandas创建出来,方便后续测试:
import pandas as pd import numpy as np # 原始数据对应转换为DataFrame df = pd.DataFrame({ 'id': [1, 1, 2, 3, 3, 4, 4], 'info1': ["'a'", "'b'", "'c'", "'d'", "'e'", "'f'", "'g'"], 'info2': ['xxx', 'xxx', 'mmm', 'uuu', 'uuu', 'xy', 'xy'], 'info3': ['yyy', 'yyy', 'nnn', np.nan, 'ooo', np.nan, np.nan], 'info4': [np.nan] * 7 }) print("原始数据:") print(df)
2. 定义核心聚合函数
这个函数负责处理每个分组内的列值:去重、过滤缺失值,然后根据唯一值的数量返回单个值或列表:
def agg_unique_values(series): # 先去掉缺失值,再提取唯一值 unique_vals = series.dropna().unique() # 根据唯一值数量返回对应结果 if len(unique_vals) == 0: return np.nan # 没有有效数据就返回缺失值 elif len(unique_vals) == 1: return unique_vals[0] # 只有一个值就直接返回单个元素 else: return list(unique_vals) # 多个值就转成列表
3. 分组聚合得到结果
按id分组,把刚才的函数应用到所有列上:
# 按id分组,as_index=False让id保持为普通列 result_df = df.groupby('id', as_index=False).agg(agg_unique_values) print("\n处理后结果:") print(result_df)
最终效果
运行后得到的结果和你期望的完全一致:
- id=1的info1变成
["'a'", "'b'"],info2、info3因为值重复,保留单个xxx、yyy - id=3的info3原本有缺失和
ooo,过滤缺失后只保留ooo - 所有缺失值的列(比如info4)保持NaN
内容的提问来源于stack exchange,提问作者Yieh Yan
相关产品推荐
相关产品推荐

