Простой эквивалент Python SumIf

#python #pandas-groupby

Вопрос:

У меня есть фрейм данных, который я хочу сгруппировать и агрегировать на основе определенных условий и приведенного ниже упрощенного примера.

 |Key|Amount|Bitcoin
|ABC|100|0
|ABC|200|0
|ABC|100|1
 

Желаемый Результат:

 |Key|Total Amount|Bitcoin Amount
|ABC|400|100
 

Теперь я мог бы легко сгруппировать ключ и суммировать сумму, а также отдельно создать фрейм данных только с биткойн-транзакциями, сгруппировать его и объединить два фрейма данных, но для решения этой проблемы должна быть простая строка кода?

Заранее спасибо.

Комментарии:

1. как вы получаете 100 долларов за биткойн?

2.100*1 0*100 0*200?

3. ну ладно, спасибо 😉

4. Я бы хотел, чтобы у меня было 100 биткоинов. К сожалению, 10 лет назад банки Великобритании сделали все возможное, чтобы помешать гражданам Великобритании покупать их.

Ответ №1:

Я бы подошел к этому следующим образом

 import pandas as pd
df = pd.DataFrame({"Key":["ABC","ABC","ABC"],"Amount":[100,200,100],"Bitcoin":[0,0,1]})
df["BitcoinAmount"] = df["Amount"]*df["Bitcoin"]
print(df.groupby("Key").agg({"Amount":"sum","BitcoinAmount":"sum"}))
 

выход

      Amount  BitcoinAmount
Key
ABC     400            100
 

Не совсем однострочный, но его легко понять. Обратите внимание, что это сработало бы df["Bitcoin"] не только 0 для s и 1 s, но и False для s и True s.

Комментарии:

1. отлично, спасибо

Ответ №2:

Вы можете добавить еще один столбец суммы * биткойн, а затем просто группировать ключ и сумму:

 df['Bitcoin Amount'] = df['Amount'] * df['Bitcoin']
df2 = df.groupby('Key', as_index=False).sum()[['Key', 'Amount', 'Bitcoin Amount']]
 

Выход:

    Key  Amount  Bitcoin Amount
0  ABC     400      100
 

Вы можете добавить .rename(columns = {'Amount':'Total Amount'}) в конце строки groupby, если имена столбцов должны соответствовать выводимым данным.