将pandas DataFrame转换为字典并保留重复索引

6
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, age 20)就会被删除。是否有可能生成一个值为字典列表的字典?类似于这样:

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

可能的解决方案可以在此处找到:https://dev59.com/AGgv5IYBdhLWcg3wW_h_ - cors
1个回答

11

如果您按索引分组,则应该可以完成此操作。

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

将每个组转换为使用“records”方向的字典:

对于每个组,使用"records"方向转换为字典:

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 和字典推导式一样,它遍历每个分组。唯一的区别是,在结尾处需要调用 to_dict 方法将数据转换为字典。


2
您,先生,是一个巫师和学者。非常感谢!我已经苦苦挣扎了好几个小时。我可以得到这两种方法的详细解释吗? - Nolan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接