如何用Python Pandas按指定列作为键合并字典式行数据
问题描述
原始DataFrame如下:
MV id NAME ADDRESS DOC DOCTYPE PHONE 1 100 Mark Home 299 NI {123,456} 2 100 John Work A123 Pass {789,101} 3 100 Club
需求:
- 按相同
id合并行,将各列转换为字典格式 NAME、ADDRESS、PHONE列以MV列的值作为字典的键DOC列以DOCTYPE列的值作为字典的键
期望输出:
id NAME ADDRESS DOC PHONE 100 {1:Mark,2:John} {1:'Home',2:'Work',3:'Club'} {NI:'299',Pass:'A123'} {1:{123,456},2:{789,101}}
尝试的代码:
agg={'id':'first','NAME':dict,'ADDRESS':dict,'PHONE':dict} df_new=df.groupby(['CUSTOMER_CODE'],as_index=False).aggregate(agg) return df_new
遇到的问题:输出字典的键是默认索引,而非指定列的值:
id Name Address Phone 100 {0:Mark,1:John} {0:Home,1:Work,2:Club} {0:{123,456},1:{789,101}}
解决方案
直接使用dict作为聚合函数会默认采用组内的行索引作为键,无法满足指定列作为键的需求,需要自定义聚合逻辑来实现:
实现代码
import pandas as pd # 构造示例DataFrame(如果已有数据可跳过此步骤) data = { 'MV': [1, 2, 3], 'id': [100, 100, 100], 'NAME': ['Mark', 'John', None], 'ADDRESS': ['Home', 'Work', 'Club'], 'DOC': ['299', 'A123', None], 'DOCTYPE': ['NI', 'Pass', None], 'PHONE': [{123,456}, {789,101}, None] } df = pd.DataFrame(data) # 通用聚合函数:生成以指定列作为键的字典 def agg_by_key(key_col): def inner(group): # 过滤空值,避免无效键值对 valid_rows = group.dropna(subset=[group.name, key_col]) return dict(zip(valid_rows[key_col], valid_rows[group.name])) return inner # DOC列专属聚合:以DOCTYPE为键 def agg_doc(group): valid_rows = group.dropna(subset=['DOC', 'DOCTYPE']) return dict(zip(valid_rows['DOCTYPE'], valid_rows['DOC'])) # 按id分组并执行聚合 result_df = df.groupby('id', as_index=False).agg( NAME=agg_by_key('MV'), ADDRESS=agg_by_key('MV'), PHONE=agg_by_key('MV'), DOC=agg_doc ) print(result_df)
代码说明
agg_by_key是通用工具函数,接受键列名称(如MV),返回一个聚合函数,该函数会将组内目标列与键列的值配对生成字典,同时过滤掉空值行。agg_doc针对DOC列定制,用DOCTYPE列的值作为字典的键来聚合DOC内容。- 分组聚合时为每个列指定对应的自定义函数,确保生成的字典使用指定列作为键。
运行结果
id NAME ADDRESS DOC PHONE 0 100 {1: 'Mark', 2: 'John'} {1: 'Home', 2: 'Work', 3: 'Club'} {'NI': '299', 'Pass': 'A123'} {1: {123, 456}, 2: {789, 101}}
内容的提问来源于stack exchange,提问作者Bahy Mohamed
相关产品推荐
相关产品推荐

