Разница между групповыми суммами панд - PullRequest
0 голосов
/ 11 октября 2018

DF:

    fruits     date      amount
0   Apple   2018-01-01   100
1   Orange  2018-01-01   200
2   Apple   2018-01-01   150
3   Apple   2018-01-02   100
4   Orange  2018-01-02   100
5   Orange  2018-01-02   100

Код для создания этого:

f = [["Apple","2018-01-01",100],["Orange","2018-01-01",200],["Apple","2018-01-01",150],
 ["Apple","2018-01-02",100],["Orange","2018-01-02",100],["Orange","2018-01-02",100]]
df = pd.DataFrame(f,columns = ["fruits","date","amount"])

Я пытаюсь объединить продажи фруктов для каждой даты и найти разницу между суммами

Ожидаемая операция:

date          diff
2018-01-01 .   50 
2018-01-02 .  -100 

Как найти сумму продаж Apple и Orange и найти разницу между суммами

Я могу найти сумму:

df.groupby(["date","fruits"])["amount"].agg("sum") 

   date        fruits
 2018-01-01    Apple     250
               Orange    200
 2018-01-02    Apple     100
               Orange    200
  Name: amount, dtype: int64

Любые предложения о том, как найти разницу в самих пандах.

Ответы [ 3 ]

0 голосов
/ 11 октября 2018

Используя groupby date и apply, используя lambda function как:

df.groupby("date").apply(lambda x: x.loc[x['fruits']=='Apple','amount'].sum() - 
                                   x.loc[x['fruits']=='Orange','amount'].sum())

date
2018-01-01     50
2018-01-02   -100
dtype: int64

Или группируйте фрукты отдельно и находя разницу:

A = df[df.fruits.isin(['Apple'])].groupby('date')['amount'].sum()
O = df[df.fruits.isin(['Orange'])].groupby('date')['amount'].sum()

O-A
date
2018-01-01    -50
2018-01-02    100
Name: amount, dtype: int64
0 голосов
/ 11 октября 2018

Добавьте unstack для изменения формы и затем вычтите с pop для столбцов извлечения:

df = df.groupby(["date","fruits"])["amount"].sum().unstack()
df['diff'] = df.pop('Apple') - df.pop('Orange')
print (df)
fruits      diff
date            
2018-01-01    50
2018-01-02  -100
0 голосов
/ 11 октября 2018
def get_diff(grp):
    grp = grp.groupby('fruits').agg(sum)['amount'].values
    return grp[0] - grp[1]

df.groupby('date').apply(get_diff)

Выход

date
2018-01-01     50
2018-01-02   -100
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...