2014-10-31 61 views
1

虽然我找到关于如何将pandas DataFrame转换为字典的帮助和文档,以便列是键和值是行,但我发现自己卡住了,希望获得列值之一作为键和另一列值的相关值,所以像这样长格式熊猫数据框到字典

a b 
1 car 
1 train 
2 boot 
2 computer 
2 lipstick 

一个DF转换为以下词典{'1': ['car','train'], '2': ['boot','computer','lipstick]}

我有一种感觉它的东西很简单,但我的想法。我试过df.groupby('a').to_dict()但未成功

有什么建议吗?

回答

1

您不能在GROUPBY的结果进行to_dict(),但你可以使用它来执行你自己的字典构造。以下代码将与您提供的示例一起使用。

import pandas as pd 

df = pd.DataFrame(dict(a=[1,1,2,2,2], 
         b=['car', 'train', 'boot', 'computer', 'lipstick'])) 
# Using a loop 
dt = {} 
for g, d in df.groupby('a'): 
    dt[g] = d['b'].values 

# Using dictionary comprehension 
dt2 = {g: d['b'].values for g, d in df.groupby('a')} 

现在无论dtdt2将字典是这样的:

{1: array(['car', 'train'], dtype=object), 
2: array(['boot', 'computer', 'lipstick'], dtype=object)} 

当然你也可以把numpy的阵列回列表,如果你愿意的话。

+0

完美的作品像一个魅力非常感谢!出于某种原因,您构建pd.DataFrame的行会返回“dict”不可调用的错误。以防万一你想编辑它以供将来参考。 – Bastien 2014-10-31 23:29:16

+0

这很奇怪,对我来说工作正常,而且看起来不像是一个错字......嗯。 – Ajean 2014-11-01 00:05:43

+0

哦,废料,我只是再次测试它,它的工作。也许我第一次尝试时做错了什么。无论如何,再次感谢! – Bastien 2014-11-01 00:09:49

1

是的,因为DataFrameGroupBy没有to_dict的属性,只有DataFrameto_dict属性。

DataFrame.to_dict(outtype ='dict') 将DataFrame转换为字典。

你可以阅读更多关于DataFrame.to_dicthere

看看这个:

import pandas as pd 

df = pd.DataFrame([np.random.sample(9), np.random.sample(9)]) 
df.columns = [c for c in 'abcdefghi'] 
# it will convert the DataFrame to dict, with {column -> {index -> value}} 
df.to_dict() 
{'a': {0: 0.53252618404947039, 1: 0.78237275521385163}, 
'b': {0: 0.43681232450879315, 1: 0.31356312459390356}, 
'c': {0: 0.84648298651737541, 1: 0.81417040486070058}, 
'd': {0: 0.48419015448536995, 1: 0.37578177386187273}, 
'e': {0: 0.39840348154035421, 1: 0.35367537180764919}, 
'f': {0: 0.050381560155985827, 1: 0.57080653289506755}, 
'g': {0: 0.96491634442628171, 1: 0.32844653606404517}, 
'h': {0: 0.682, 1: 0.0097104037581828839}, 
'i': {0: 0.66836630467152902, 1: 0.69104505886376366}} 

type(df) 
pandas.core.frame.DataFrame 

# DataFrame.groupby is another type 
type(df.groupby('a')) 
pandas.core.groupby.DataFrameGroupBy 

df.groupby('a').to_dict() 
AttributeError: Cannot access callable attribute 'to_dict' of 'DataFrameGroupBy' objects, try using the 'apply' method 
+0

疑难杂症感谢指点! – Bastien 2014-10-31 23:30:38

2

您可以认为这是一个GROUPBY聚集(即,果然每组为一个值的操作 - 在此情况下一个列表):

In [85]: df.groupby(['a'])['b'].agg(lambda grp: list(grp)) 
Out[85]: 
a 
1     [car, train] 
2 [boot, computer, lipstick] 
dtype: object 

In [68]: df.groupby(['a'])['b'].agg(lambda grp: list(grp)).to_dict() 
Out[68]: {1: ['car', 'train'], 2: ['boot', 'computer', 'lipstick']} 
+0

哦,那也行! – Bastien 2014-11-01 01:07:04