У меня есть DataFrame df_sale в Python, который я хочу изменить, подсчитать сумму по столбцу price и добавить новый столбец total. Ниже представлен df_sale:
b_no a_id price c_id
120 24 50 2
120 56 100 2
120 90 25 2
120 45 20 2
231 89 55 3
231 45 20 3
231 10 250 3
Исключенный выход после изменения формы:
b_no a_id_1 a_id_2 a_id_3 a_id_4 total c_id
120 24 56 90 45 195 2
231 89 45 10 0 325 3
До сих пор я пробовал использовать sum() на df_sale['price'] отдельно для 120 и 231. Я не понимаю, как мне изменить форму данных, добавить новые заголовки столбцов и получить общую сумму, не будучи вычислительно неэффективным. Спасибо.






Возможно, это не самый чистый метод (вообще), но он дает желаемый результат:
reshaped_df = (df.groupby('b_no')[['price', 'c_id']]
.first()
.join(df.groupby('b_no')['a_id']
.apply(list)
.apply(pd.Series)
.add_prefix('a_id_'))
.drop('price',1)
.join(df.groupby('b_no')['price'].sum().to_frame('total'))
.fillna(0))
>>> reshaped_df
c_id a_id_0 a_id_1 a_id_2 a_id_3 total
b_no
120 2 24.0 56.0 90.0 45.0 195
231 3 89.0 45.0 10.0 0.0 325
Вы можете добиться этой группировки с помощью b_no и c_id, суммируя total и сглаживая a_id:
import pandas as pd
d = {"b_no": [120,120,120,120,231,231, 231],
"a_id": [24,56,90,45,89,45,10],
"price": [50,100,25,20,55,20,250],
"c_id": [2,2,2,2,3,3,3]}
df = pd.DataFrame(data=d)
df2 = df.groupby(['b_no', 'c_id'])['a_id'].apply(list).apply(pd.Series).add_prefix('a_id_').fillna(0)
df2["total"] = df.groupby(['b_no', 'c_id'])['price'].sum()
print(df2)
a_id_0 a_id_1 a_id_2 a_id_3 total
b_no c_id
120 2 24.0 56.0 90.0 45.0 195
231 3 89.0 45.0 10.0 0.0 325
Большое спасибо! Работал как шарм. Удивительно, как мне еще предстоит пройти долгий путь, чтобы писать коды, как ты.