Pandas - 如何将属性保存到数组中并将它们的值保存到新列中

Pandas - how to save attributes into an array and preserve their values into new columns

我有一个具有属性 "key""name""value” 的数据框。对于每个 "key" 组,我想要属性 "name" 存储在一个数组中。然后每个名称的 "value" 将存储到它自己的名为 "<name>_value" 的列中。例如:

  key    name    value
0   A  Patton        2
1   A  Arthur        2
2   B    Will        1
3   B  Patton        1

上面的数据框应该这样转换:

  key              name    Patton_value    Arthur_value    Will_value
0   A  [Patton, Arthur]               2               2          null
1   B    [Patton, Will]               1            null             1

到目前为止我尝试过的是:

df.groupby('key').name.apply(list).reset_index()

但我不知道如何保留 "name" 的值并将它们保存为一列。

可能有更简洁的方法来做到这一点,但这个有效:

D = df.pivot(columns='name', index='key', values='value').reset_index().rename_axis(None, axis=1)
D['name'] = D.apply(lambda x: df['name'][df['key'] == x['key']].values, axis=1).reset_index(drop=True)
D = D[[D.columns[0], D.columns[-1], *D.columns[1:-1]]]
D.columns = [*D.columns[:2], *D.columns[2:] + '_value']

输出:

>>> D
  key              name  Arthur_value  Patton_value  Will_value
0   A  [Patton, Arthur]           2.0           2.0         NaN
1   B    [Will, Patton]           NaN           1.0         1.0

您可以创建一个 name_list 列并旋转数据框:

df['name_list'] = df['key'].map(df.groupby('key')['name'].agg(tuple)) 
out = df.pivot_table(values='value', index=['key','name_list'], columns='name').add_suffix('_value').reset_index().rename({'name_list':'name'}, axis=1)
out['name'] = out['name'].apply(list)
out.columns.name = None

输出:

  key              name  Arthur_value  Patton_value  Will_value
0   A  [Patton, Arthur]           2.0           2.0         NaN
1   B    [Will, Patton]           NaN           1.0         1.0