将groupby选定的列作为字典移到新的pandas列中

时间:2019-10-09 14:51:23

标签: python pandas dataframe dictionary

我在python中有以下pandas DataFrame:

df = pd.DataFrame({'id': [1, 1, 2, 2, 3],
                   'field1': [1, 2, 3, 4, 5],
                   'field2': ['a', 'b', 'c', 'd', 'e']})
    id  field1  field2
0   1   1       a
1   1   2       b
2   2   3       c
3   2   4       d
4   3   5       e

我想按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'}]

我可以使用以下python代码实现这一目标:

def test(df):
    df['fields'] = [df[['field1', 'field2']].to_dict(orient='records')]*len(df)
    return df

df.groupby('id').apply(test).drop_duplicates('id')[['id', 'fields']]

但是我相信它可以做得更好。问题是如何? 我对这部分内容特别不满意:

df['fields'] = [df[['field1', 'field2']].to_dict(orient='records')]*len(df)

在这里,我必须列出组的长度,以便将相同的字典值分配给行。 另外,这使它更占用内存。

2 个答案:

答案 0 :(得分:5)

也许

df.set_index('id').groupby(level=0).apply(pd.DataFrame.to_dict, orient='r')

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

始终可以在末尾添加.to_frame('fields'),以找回df

答案 1 :(得分:2)

您还可以使用:

padding='same'

df.groupby('id')['field1','field2'].apply(lambda x: x.to_dict('r')).rename('fields').reset_index()