如何在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}
存在两处问题:
- 遍历三层索引时会重复处理同一分组的行,产生冗余计算;
- 最终得到的
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
相关产品推荐
相关产品推荐

