У меня есть фрейм данных, подобный этому ниже.
df = pd.DataFrame({
'date': ["22.10.2021", "22.10.2021", "22.10.2021", "22.10.2021", "23.10.2021"],
'Product': ["apple", "apple", "orange", "orange", "cherry"],
'sold_kg': [2, 3, 1, 6, 2]})
df['Qty of Orange Sold that day'] = df.groupby(['date', 'Product']).sold_kg.transform("sum")
Моя фактическая группа будет состоять из 7-8 аргументов. Мне нужно, чтобы один из них был постоянным. Например, я хочу, чтобы он вычислял количество только апельсинов, проданных в этот день, но только для апельсинов. Я имею в виду даже что-то вроде - но, конечно, это не сработало. Не могли бы вы что-нибудь посоветовать?
df['Qty of Orange Sold that day'] = = df.groupby(['date', 'Product'=='orange']).sold_kg.transform("sum")
Весь процесс можно разделить на две части.
Сначала отфильтруйте апельсины:
oranges = df[df['Product'] == 'orange']
Затем группировать по дате
oranges.groupby(['date'])
Если вы хотите сделать это в одной строке:
df[df['Product'] == 'orange'].groupby(['date'])
Возможны ошибки, я с мобильного.
спасибо, но тогда он будет применяться только к строкам, где продукт оранжевого цвета. Мне нужно, чтобы сумма проданных апельсинов (ежедневно) отображалась во всех строках. Я имею в виду, даже если это яблоко, мне нужно, чтобы они показывали количество проданных апельсинов.
О, вы правы, я полностью пропустил эту часть.
IIUC, итерация по группам и присвоение нового значения новому столбцу должны работать. Это можно было бы записать в пользовательскую лямбда-функцию с помощью применения, но таким образом у меня были аналогичные результаты скорости.
df = pd.DataFrame({
'date': ["22.10.2021", "22.10.2021", "22.10.2021", "22.10.2021", "23.10.2021", "23.10.2021", "23.10.2021", "23.10.2021", "23.10.2021", "25.10.2021"],
'Product': ["apple", "apple", "orange", "orange", "cherry","apple", "apple", "orange", "orange", "cherry"],
'sold_kg': [2, 3, 1, 6, 2,1, 5, 2, 3, 3]})
# the if is needed in case there are no 'oranges' in a particular date. otherwise, it's throws an error.
my_constant = 'orange'
dfg = df.groupby(['date'])
df_list = []
for grp in dfg.groups:
g = dfg.get_group(grp)
if g.groupby(['Product']).sum().filter(like=my_constant, axis = 0)['sold_kg'].values.size > 0:
val = g.groupby(['Product']).sum().filter(like=my_constant, axis = 0)['sold_kg'].values[0]
else:
val = 0
df_list.append(g.assign(totals=val))
out_pd = pd.concat(df_list, axis=0)
out_pd
date Product sold_kg totals
0 22.10.2021 apple 2 7
1 22.10.2021 apple 3 7
2 22.10.2021 orange 1 7
3 22.10.2021 orange 6 7
4 23.10.2021 cherry 2 5
5 23.10.2021 apple 1 5
6 23.10.2021 apple 5 5
7 23.10.2021 orange 2 5
8 23.10.2021 orange 3 5
9 25.10.2021 cherry 3 0
возможно, подход является косвенным, но предлагает создать новый столбец на основе ваших условий, которые будут равны проданному_количеству или 0.
df = pd.DataFrame({
'date': ["22.10.2021", "22.10.2021", "22.10.2021", "22.10.2021", "23.10.2021"],
'Product': ["apple", "apple", "orange", "orange", "orange"],
'sold_kg': [2, 3, 1, 6, 2]})
m1='orange'
df['temp']=np.where(df['Product'].astype(str)=='orange',df['sold_kg'], 0)
df['sold_orange']=df.groupby('date')['temp'].transform('sum')
df.drop('temp', axis =1, inplace=True)
df
Спасибо! да, этот подход будет полезным!
print(df.groupby(['date','Product']).sum().filter(like='orange', axis = 0))