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
我有一个具有属性 "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