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

如何在Pandas分组后将列转换为键值对列

Pandas按多列分组后将指定列转为键值对存入新列

问题描述

需要对如下Pandas DataFrame按Col X和Col Y分组,将ID与Value列转换为键值对形式存入Out列:

原始DataFrame

Col X    Col Y    ID     Value
 A         a      'r'      3
 A         a      'b'      2
 A         a      'c'      1
 B         b      'd'      5
 B         b      's'      6
 B         b      'd'      7  

期望输出

Col X    Col Y    Out
 A         a      {'r':3, 'b':2, 'c':1}
 B         b      {'d': 5, 's': 6, 'd':7}

现有尝试问题

你尝试的代码:

df = df.set_index(['Col X', 'Col Y', 'ID']).Value
dict_column = {k: df.xs((k, v)).to_dict() for k,v,v2 in df.index}

存在两处问题:

  1. 遍历三层索引时会重复处理同一分组的行,产生冗余计算;
  2. 最终得到的dict_column是普通字典,无法直接转换为目标格式的DataFrame。

正确解决方法

使用groupby结合apply可以高效实现需求,直接对每组构造键值对字典:

import pandas as pd

# 构造原始数据(实际使用时替换为你的DataFrame)
df = pd.DataFrame({
    'Col X': ['A', 'A', 'A', 'B', 'B', 'B'],
    'Col Y': ['a', 'a', 'a', 'b', 'b', 'b'],
    'ID': ["'r'", "'b'", "'c'", "'d'", "'s'", "'d'"],
    'Value': [3, 2, 1, 5, 6, 7]
})

# 分组并生成键值对字典
result_df = df.groupby(['Col X', 'Col Y']).apply(
    lambda group: dict(zip(group['ID'], group['Value']))
).reset_index(name='Out')

print(result_df)

注意事项

Python字典的键具有唯一性,因此如果分组内存在重复的ID(如示例中B组的两个'd'),后面的Value会覆盖前面的值,实际输出中B组的Out列会是{"'d'":7, "'s'":6},而非期望中的重复键形式。如果需要保留所有重复键的信息,可以改用列表嵌套元组的形式,比如[("'d'",5), ("'s'",6), ("'d'",7)],只需把lambda里的dict换成list即可:

lambda group: list(zip(group['ID'], group['Value']))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 05:35:19