Панды группового и использовать числа между различными типами - PullRequest
1 голос
/ 13 мая 2019

Допустим, у меня есть df, как это:

client   order_type    amount
John     Buy           100
John     Sell          100
Jeff     Buy           100
Jeff     Buy           100
Aaron    Buy           100
Aaron    Sell          100
Aaron    Buy           100

если я это сделаю:

df.groupby(['client','order_type'])['amount'].sum()

Я бы получил что-то вроде:

John    Buy   100
        Sell  100
Jeff    Buy   100
        Sell  100
Aaron   Buy   200
        Sell  100

Как получить что-то вроде столбца Buy - Sell в новом фрейме данных:

Name      NetBuy
John      0
Jeff      200
Aaron     100

Ответы [ 2 ]

1 голос
/ 13 мая 2019

Сначала приведите значения sell к отрицательным значениям, затем используйте groupby.sum:

df['amount'] = np.where(df['order_type'].eq('Sell'), -df['amount'], df['amount'])

df.groupby('client', as_index=False)['amount'].sum()

  client  amount
0  Aaron     100
1   Jeff     200
2   John       0
1 голос
/ 13 мая 2019

Просто сопоставьте ваш order_type со знаком, есть много способов сделать это, но на мой взгляд, проще всего было бы прочитать это:

df['sign'] = [1 if x == 'Buy' else -1 for x in df.order_type]
df['amount_adj'] = df.sign*df.amount
df.groupby(['client'])['amount_adj'].sum()

Выход:

client
Aaron    100
Jeff     200
John       0

Тот же результат при использовании однострочника и более быстрого np.where:

df = df.assign(amount=np.where(df.order_type.eq('Sell'), 
          df.amount*-1, df.amount)).groupby(['client'])['amount'].sum()

выход:

client
Aaron    100
Jeff     200
John       0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...