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

Nol*_*lan 6 python dictionary dataframe pandas

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'}}
>>>
Run Code Online (Sandbox Code Playgroud)

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

{'bob': [{'age': 20, 'name': 'bob'}, {'age': 30, 'name': 'bob'}], 'jim': [{'age': 25, 'name': 'jim'}]}
Run Code Online (Sandbox Code Playgroud)

cs9*_*s95 11

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

\n

groupby理解

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

详细信息
\ngroupby允许我们根据唯一键对数据进行分区:

\n
for k, g in df.groupby(level=0):\n    print(g, end='\\n\\n')\n\n      age name\nname          \nbob    20  bob\nbob    30  bob\n\n      age name\nname          \njim    25  jim\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
for k, g in df.groupby(level=0):\n    print(g.to_dict('r'))\n\n[{'age': 20, 'name': 'bob'}, {'age': 30, 'name': 'bob'}]\n[{'age': 25, 'name': 'jim'}]\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
\n

GroupBy.apply+to_dict

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

apply与字典理解执行相同的操作\xe2\x80\x94它迭代每个组。唯一的区别是最后apply需要一次最后的调用来解释数据。to_dict

\n

  • 先生,您是一位巫师和学者。太感谢了!我已经为此苦苦挣扎了几个小时。我可以详细了解这两种方法吗? (2认同)