虽然我找到了有关如何将pandas DataFrame转换为字典的帮助和文档,以便列是键,值是行,但当我希望将列的某个值作为键时,我发现自己陷入了困境。另一列的关联值作为值,因此像这样的df
a b
1 car
1 train
2 boot
2 computer
2 lipstick
转换为以下字典{'1': ['car','train'], '2': ['boot','computer','lipstick]}
我觉得这很简单,但我没有想法。我试过df.groupby('a').to_dict()
但是没有成功
有什么建议吗?
答案 0 :(得分:2)
您可以将其视为groupby-aggregation(即将每个组转换为一个值的操作 - 在本例中为列表):
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']}
答案 1 :(得分:1)
是的,因为DataFrameGroupBy
没有to_dict
的属性,只有DataFrame
具有to_dict
属性。
DataFrame.to_dict(outtype = '字典') 将DataFrame转换为字典。
您可以阅读有关DataFrame.to_dict
here
看看这个:
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.68201236712813085, 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
答案 2 :(得分: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')}
现在,dt
和dt2
都是这样的词典:
{1: array(['car', 'train'], dtype=object),
2: array(['boot', 'computer', 'lipstick'], dtype=object)}
当然,如果您愿意,可以将numpy数组放回列表中。