Как мне изменить этот DataFrame в Python?

У меня есть 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. Я не понимаю, как мне изменить форму данных, добавить новые заголовки столбцов и получить общую сумму, не будучи вычислительно неэффективным. Спасибо.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
0
61
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Возможно, это не самый чистый метод (вообще), но он дает желаемый результат:

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

Большое спасибо! Работал как шарм. Удивительно, как мне еще предстоит пройти долгий путь, чтобы писать коды, как ты.

K. K. 07.07.2018 20:52

Вы можете добиться этой группировки с помощью 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

Другие вопросы по теме