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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 14:02:47