python - 将 pandas DataFrame 转换为 dict 并保留重复索引

标签 python pandas dictionary dataframe

vagrant@ubuntu-xenial:~/lb/f5/v12$ python
Python 2.7.12 (default, Nov 12 2018, 14:36:49)
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import pandas as pd
>>> data = [{'name': 'bob', 'age': 20}, {'name': 'jim', 'age': 25}, {'name': 'bob', 'age': 30}]
>>> df = pd.DataFrame(data)
>>> df.set_index(keys='name', drop=False, inplace=True)
>>> df
      age name
name
bob    20  bob
jim    25  jim
bob    30  bob
>>> df.to_dict(orient='index')
{'bob': {'age': 30, 'name': 'bob'}, 'jim': {'age': 25, 'name': 'jim'}}
>>>

如果我们将数据帧转换为字典,重复条目(bob,年龄 20)将被删除。有没有可能的方法来生成一个其值是字典列表的字典?看起来像这样的东西?

{'bob': [{'age': 20, 'name': 'bob'}, {'age': 30, 'name': 'bob'}], 'jim': [{'age': 25, 'name': 'jim'}]}

最佳答案

如果您对索引进行分组,应该可以做到这一点。

groupby 理解

{k: g.to_dict(orient='records') for k, g in df.groupby(level=0)}
# {'bob': [{'age': 20, 'name': 'bob'}, {'age': 30, 'name': 'bob'}],
#  'jim': [{'age': 25, 'name': 'jim'}]}

详情
groupby 允许我们根据唯一键对数据进行分区:

for k, g in df.groupby(level=0):
    print(g, end='\n\n')

      age name
name          
bob    20  bob
bob    30  bob

      age name
name          
jim    25  jim

对于每个组,使用“记录”方向将其转换为字典:

for k, g in df.groupby(level=0):
    print(g.to_dict('r'))

[{'age': 20, 'name': 'bob'}, {'age': 30, 'name': 'bob'}]
[{'age': 25, 'name': 'jim'}]

并可以通过石斑鱼键访问它。

<小时/>

GroupBy.apply + to_dict

df.groupby(level=0).apply(lambda x: x.to_dict('r')).to_dict()
# {'bob': [{'age': 20, 'name': 'bob'}, {'age': 30, 'name': 'bob'}],
#  'jim': [{'age': 25, 'name': 'jim'}]}

apply 执行与字典理解相同的操作 - 它迭代每个组。唯一的区别是 apply 将需要最后一次调用 to_dict 来对数据进行听写。

关于python - 将 pandas DataFrame 转换为 dict 并保留重复索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54137903/

相关文章:

java - (Hash-)Map 有条目,get 传递 null

javascript - Python - 从数组中提取元素,类似于 JavaScript ES6 解构

Python FTPS上传错误: 425 Unable to build data connection: Operation not permitted

python - 如何在pandas中groupby之后获得两组之间的p值?

python - 如何禁用 PyQt 中 QTreeView 和 QFileSystemModel 的双击文件重命名行为?

python - 如何在 Jupyter Notebook 中的绘图旁边显示数据框

python - 有条件地重命名多个列名称

python - 将 map() 函数(来自 Pool 类)返回的列表转换为 Python 中的字典

python - Sphinx 不改变版本号

python - 具有许多离散特征的机器学习数据集