Добавить в pandas столбец с промежуточными суммами по групам

Рейтинг: 0Ответов: 1Опубликовано: 31.01.2023

Есть данные по продажам. нужно добавить для каждого счета общее количество штук различных товаров по счету. Другими совами - добавить столбец где для каждой группы будет сумма столбца по данной группе. Данный код работает.

import pandas as pd


df_fee = pd.DataFrame(
    dict(
        sku=2*[1, 1, 2, 3, 4, 4],
        order_id=3*[3, 3, 4, 5],
        quantity=4*[ 1, 2, 3],
    )
)


def __count_nd_fill_units_by_group(g):
    order_sum = g['quantity'].sum()
    g.loc[:, "units_in_order"] = order_sum
    #   
    # g = g.assign(units_in_order=order_sum)
    #             
    return g

print(df_fee)   
df_fee.loc[:, "units_in_order"] = None
df_fee = df_fee.groupby(['order_id', ], group_keys=False).apply(__count_nd_fill_units_by_group)
df_fee.sort_values(by=['order_id',], inplace=True)
print(df_fee) 

и выдает такой результат:

        sku  order_id  quantity
0     1         3         1
1     1         3         2
2     2         4         3
3     3         5         1
4     4         3         2
5     4         3         3
6     1         4         1
7     1         5         2
8     2         3         3
9     3         3         1
10    4         4         2
11    4         5         3
    sku  order_id  quantity  units_in_order
0     1         3         1              12
1     1         3         2              12
4     4         3         2              12
5     4         3         3              12
8     2         3         3              12
9     3         3         1              12
2     2         4         3               6
6     1         4         1               6
10    4         4         2               6
3     3         5         1               6
7     1         5         2               6
11    4         5         3               6

d:\onedrive\projects\chud_amaz\soft_in_dev\moduled_way_oop\code_questions\order_total_units_filling.py:21: FutureWarning: In a future version, df.iloc[:, i] = newvals will attempt to set the values inplace instead of always setting a new array. To retain the old behavior, use either df[df.columns[i]] = newvals or, if columns are non-unique, df.isetitem(i, newvals) g.loc[:, "units_in_order"] = order_sum

Два вопроса.

  1. по ощущениям можно лучше (короче, проще, быстрее)
  2. что за сообщение выдается в конце. Это потенциально опасно?

Ответы

▲ 2Принят

Можно короче, конечно:

import pandas as pd

df_fee = pd.DataFrame(dict(sku=2*[1, 1, 2, 3, 4, 4], order_id=3*[3, 3, 4, 5], quantity=4*[ 1, 2, 3],))

df_fee["units_in_order"] = df_fee.groupby("order_id")["quantity"].transform(sum)
df_fee.sort_values("order_id",  inplace=True)

df_fee:

    sku  order_id  quantity  units_in_order
0     1         3         1              12
1     1         3         2              12
4     4         3         2              12
5     4         3         3              12
8     2         3         3              12
9     3         3         1              12
2     2         4         3               6
6     1         4         1               6
10    4         4         2               6
3     3         5         1               6
7     1         5         2               6
11    4         5         3               6