【发布时间】:2022-01-25 08:31:14
【问题描述】:
我想将 pandas 数据框转换为多键字典,使用 2 列或更多列作为字典键,并且我希望这些键与顺序无关。
以下是将 pandas 字典转换为常规多键字典的示例,其中顺序是相关的。
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randint(0,100,size=(5, 3)), columns=list('ABC'))
df_dict = df.set_index(['B', 'C']).to_dict()['A']
print(df_dict)
{(33, 21): 85, (61, 46): 88, (78, 12): 48, (89, 18): 65, (91, 19): 41}
所以df_dict[(33, 21)] 将得到85,但df_dict[(21, 33)] 将导致密钥错误。
潜在的解决方案
这是一个 SO 问题,涵盖了使用 sorted、tuple、Counter 和/或 freezeset 制作与订单无关的字典的方法。
Multiples-keys dictionary where key order doesn't matter
但是,在我使用 Pandas 转换方法中使用这些数据类型和函数时,没有明显的解决方案。
下一个想法是在数据帧转换后转换字典键。
我试过了
new_d = {frozenset(key): value for key, value in df_dict}
但是出现了这个错误
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-49-6a3244440ac2> in <module>()
----> 1 new_d = {frozenset(key): value for key, value in df_dict}
2 new_d
<ipython-input-49-6a3244440ac2> in <dictcomp>(.0)
----> 1 new_d = {frozenset(key): value for key, value in df_dict}
2 new_d
TypeError: 'int' object is not iterable
【问题讨论】:
标签: python pandas dataframe dictionary