通过组合多个行值将 pandas 导出到字典

数据挖掘 Python 熊猫 数据争吵
2021-10-05 04:57:02

df我有一个看起来像这样的熊猫数据框

name    value1     value2
A       123         1
B       345         5
C       712         4
B       768         2
A       318         9
C       178         6
A       321         3

我想将其转换为字典,其中name包含所有值的键和字典列表(value1 键和 value2 值)name

所以,输出看起来像这样

{
 'A': [{'123':1}, {'318':9}, {'321':3}],
 'B': [{'345':5}, {'768':2}],
 'C': [{'712':4}, {'178':6}]
}

所以,到目前为止,我已经设法name通过做

df.set_index('name').transpose().to_dict(orient='list')

如何获得我想要的输出?有没有办法聚合同一name列的所有值并以我想要的形式获取它们?

4个回答

这是否符合您的要求?

from pandas import DataFrame

df = DataFrame([['A', 123, 1], ['B', 345, 5], ['C', 712, 4], ['B', 768, 2], ['A', 318, 9], ['C', 178, 6], ['A', 321, 3]], columns=['name', 'value1', 'value2'])

d = {}
for i in df['name'].unique():
    d[i] = [{df['value1'][j]: df['value2'][j]} for j in df[df['name']==i].index]

这返回

  Out[89]: 
{'A': [{123: 1}, {318: 9}, {321: 3}],
 'B': [{345: 5}, {768: 2}],
 'C': [{712: 4}, {178: 6}]}

to_dict()方法将列名设置为字典键,因此您需要稍微重塑 DataFrame。将“ID”列设置为索引,然后转置 DataFrame 是实现此目的的一种方法。

可以使用以下行进行相同的操作:

>>> df.set_index('ID').T.to_dict('list')
{'p': [1, 3, 2], 'q': [4, 3, 2], 'r': [4, 0, 9]}

最好使用groupby,

df.groupby('name')[['value1','value2']].apply(lambda g: g.values.tolist()).to_dict()
df.groupby('name')[['value1','value2']].apply(lambda g: g.values.tolist()).to_dict()

如果您需要明确的元组列表:

df.groupby('name')[['value1','value2']].apply(lambda g: list(map(tuple, g.values.tolist()))).to_dict()

以@nemo 的答案(上图)为基础,这将比公认的解决方案更快,这将提供您想要的相同输出:

def formatRecords(g):
    keys = ['value1', 'value2']
    result = []
    for item in g.values.tolist():
        item = dict(zip(keys, item))
        result.append(item)
    return result

df_dict = df.groupby('name').apply(lambda g: formatRecords(g)).to_dict()