Pandas groupby с постоянными критериями

У меня есть фрейм данных, подобный этому ниже.

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")

print(df.groupby(['date','Product']).sum().filter(like='oran‌​ge', axis = 0))

Mário César Fracalossi Bais 17.05.2022 00:14
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения текстовых сообщений может быть настолько сложным или простым, насколько вы его сделаете. Как и в любом ML-проекте, вы можете выбрать...
7 лайфхаков для начинающих Python-программистов
7 лайфхаков для начинающих Python-программистов
В этой статье мы расскажем о хитростях и советах по Python, которые должны быть известны разработчику Python.
Установка Apache Cassandra на Mac OS
Установка Apache Cassandra на Mac OS
Это краткое руководство по установке Apache Cassandra.
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
В одном из недавних постов я рассказал о том, как я использую навыки количественных исследований, которые я совершенствую в рамках программы TPQ...
Создание персонального файлового хранилища
Создание персонального файлового хранилища
Вы когда-нибудь хотели поделиться с кем-то файлом, но он содержал конфиденциальную информацию? Многие думают, что электронная почта безопасна, но это...
Создание приборной панели для анализа данных на GCP - часть I
Создание приборной панели для анализа данных на GCP - часть I
Недавно я столкнулся с интересной бизнес-задачей - визуализацией сбоев в цепочке поставок лекарств, которую могут просматривать врачи и...
0
1
37
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Весь процесс можно разделить на две части.

Сначала отфильтруйте апельсины:

oranges = df[df['Product'] == 'orange']

Затем группировать по дате

oranges.groupby(['date'])

Если вы хотите сделать это в одной строке:

df[df['Product'] == 'orange'].groupby(['date'])

Возможны ошибки, я с мобильного.

спасибо, но тогда он будет применяться только к строкам, где продукт оранжевого цвета. Мне нужно, чтобы сумма проданных апельсинов (ежедневно) отображалась во всех строках. Я имею в виду, даже если это яблоко, мне нужно, чтобы они показывали количество проданных апельсинов.

Doni Brasko 17.05.2022 00:02

О, вы правы, я полностью пропустил эту часть.

Metin Usta 17.05.2022 00:06

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

Спасибо! да, этот подход будет полезным!

Doni Brasko 17.05.2022 13:58

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