Панды — как сохранить атрибуты в массив и сохранить их значения в новых столбцах

#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