use*_*175 3 python dictionary dataframe pandas
我在python中有以下pandas DataFrame:
df = pd.DataFrame({'id': [1, 1, 2, 2, 3],
'field1': [1, 2, 3, 4, 5],
'field2': ['a', 'b', 'c', 'd', 'e']})
Run Code Online (Sandbox Code Playgroud)
id field1 field2
0 1 1 a
1 1 2 b
2 2 3 c
3 2 4 d
4 3 5 e
Run Code Online (Sandbox Code Playgroud)
我想对上面的表进行分组,id然后将该组中所有选定的列值移动到新列中,作为python词典的列表。
因此,从以上我想得出这一点:
id fields
0 1 [{'field1': 1, 'field2': 'a'}, {'field1': 2, 'field2': 'b'}]
2 2 [{'field1': 3, 'field2': 'c'}, {'field1': 4, 'field2': 'd'}]
4 3 [{'field1': 5, 'field2': 'e'}]
Run Code Online (Sandbox Code Playgroud)
我可以使用以下python代码实现此目的:
id field1 field2
0 1 1 a
1 1 2 b
2 2 3 c
3 2 4 d
4 3 5 e
Run Code Online (Sandbox Code Playgroud)
但是我相信它可以做得更好。问题是如何?我对这部分内容特别不满意:
df['fields'] = [df[['field1', 'field2']].to_dict(orient='records')]*len(df)
Run Code Online (Sandbox Code Playgroud)
在这里,我必须列出组的长度,以便将相同的字典值分配给行。此外,这使它更占用内存。
也许
df.set_index('id').groupby(level=0).apply(pd.DataFrame.to_dict, orient='r')
Run Code Online (Sandbox Code Playgroud)
id
1 [{'field1': 1, 'field2': 'a'}, {'field1': 2, 'field2': 'b'}]
2 [{'field1': 3, 'field2': 'c'}, {'field1': 4, 'field2': 'd'}]
3 [{'field1': 5, 'field2': 'e'}]
dtype: object
Run Code Online (Sandbox Code Playgroud)
可以随时.to_frame('fields')在末尾添加以获取df回报。