#python #pandas #data-science #aggregate
#питон #панды #наука о данных #совокупный
Вопрос:
У меня есть фрейм данных, который имеет атрибуты "key"
, "name"
, и "value
«. Для каждой "key"
группы я хочу, чтобы атрибуты "name"
хранились в массиве. Затем "value"
каждое имя будет сохранено в его собственном столбце с именем "lt;namegt;_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"
и сохранить их в виде столбца.
Ответ №1:
Вы можете создать 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
Ответ №2:
Возможно, есть более лаконичные способы сделать это, но это работает:
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']
Выход:
gt;gt;gt; 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