Pandas: процентное изменение в объекте Groupby по группам - PullRequest
0 голосов
/ 14 декабря 2018

Мне нужна помощь с группой панд.Есть ли способ запустить лямбду (или эквивалент) для каждой группы в группе панд?Смотрите пример ниже.Я хотел бы добавить процентное изменение по сравнению с предыдущим годом в столбец справа в этой группе.Я перепробовал несколько методов, но все они, кажется, игнорируют запуск заново в новых группах «Предмет».

import pandas as pd
x = pd.Series(['Oranges', 'Apples', 'Other Fruits', 'Oranges', 'Apples', 'Other Fruits', 'Oranges', 'Apples', 'Other Fruits'])
y = pd.Series([2016, 2016, 2016, 2017, 2017, 2017, 2018, 2018, 2018])
z = pd.Series([12, 15, 9, 14, 15, 50, 32, 15, 12])
df = pd.DataFrame({'Item': x, 'Year':y, 'Values':z})
df=df.sort_values('Values', ascending=False) 
df.groupby(['Item', 'Year']).sum()
#How do I get Percent % Values for each group as a new column right of 'Values'

Я ожидаю следующего:

Results Expected

1 Ответ

0 голосов
/ 14 декабря 2018

Вы ищете GroupBy + apply с pct_change:

# Sort DataFrame before grouping.
df = df.sort_values(['Item', 'Year']).reset_index(drop=True)
# Group on keys and call `pct_change` inside `apply`.
df['Change'] = df.groupby('Item', sort=False).Values.apply(
     lambda x: x.pct_change()).values

df
           Item  Year  Values    Change
0        Apples  2016      15       NaN
1        Apples  2017      15  0.000000
2        Apples  2018      15  0.000000
3       Oranges  2016      12       NaN
4       Oranges  2017      14  0.166667
5       Oranges  2018      32  1.285714
6  Other Fruits  2016       9       NaN
7  Other Fruits  2017      50  4.555556
8  Other Fruits  2018      12 -0.760000
...