У меня есть следующий кадр данных панд:

user_id   label      avg_price
--------------------------------
11         A         217.3
11         B         312.1
11         C        1079.8
14         A         453.1
14         B         125.4

и вот мой желаемый результат:

   user_id     A_avg_price      B_avg_price     C_avg_price
   ---------------------------------------------------------
    11          217.3            312.1            1079.8 
    14          453.1            125.4            na    

Мой текущий подход заключается в том, чтобы циклически перемещаться по фрейму данных Pandas, собирать данные для каждого пользователя и создавать из него новый набор данных. Тем не менее, мне интересно, если есть очень элегантный способ решить эту проблему? Большое спасибо!

1
Edamame 21 Дек 2019 в 02:48

1 ответ

Лучший ответ

IIUC ,

new_df = pd.crosstab(df.user_id,df.label,df.avg_price,aggfunc='mean')

new_df.columns = new_df.columns.map(lambda x : f'{x}_avg_price')

print(new_df)

label    A_avg_price  B_avg_price  C_avg_price
user_id                                       
11             217.3        312.1       1079.8
14             453.1        125.4          NaN

чтобы соответствовать желаемому вводу, вы можете сбросить индекс и переименовать заголовки столбцов в None

new_df = pd.crosstab(df.user_id,df.label,df.avg_price,aggfunc='mean')
new_df.columns = new_df.columns.map(lambda x : f'{x}_avg_price')
new_df.reset_index(inplace=True)
new_df.columns.name = None
print(new_df)
       user_id  A_avg_price  B_avg_price  C_avg_price
0       11        217.3        312.1       1079.8
1       14        453.1        125.4          NaN
2
Datanovice 21 Дек 2019 в 00:19