Pandas groupby разделяет последовательные строки в определенных группах - PullRequest
0 голосов
/ 05 августа 2020

У меня есть pandas dataframe, например:

id variable year value
1     a      20   1.1
1     a      21   1.1
1     a      22   1.2
2     a      20   0.5
2     a      21   0.3
2     a      22   0.1
1     b      20   1.1
1     b      21   1.1
1     b      22   1.2
2     b      20   0.5
2     b      21   0.3
2     b      22   0.1

Теперь я хочу сгруппировать по id и variable и обновить столбец value, разделив значения последовательных строк для групп где variable - это. Я хочу оставить остальные группы как есть.

id variable year value
1     a      20   
1     a      21   1
1     a      22   1.09
2     a      20   
2     a      21   0.6
2     a      22   0.33
1     b      20   1.1
1     b      21   1.1
1     b      22   1.2
2     b      20   0.5
2     b      21   0.3
2     b      22   0.1

И, наконец, что касается групп с variable a, значение 2020 года недоступно, я хочу скопировать значение 2021 года в 2020 году.

id variable year value
1     a      20   1
1     a      21   1
1     a      22   1.09
2     a      20   0.6
2     a      21   0.6
2     a      22   0.33
1     b      20   1.1
1     b      21   1.1
1     b      22   1.2
2     b      20   0.5
2     b      21   0.3
2     b      22   0.1

Как этого добиться?

1 Ответ

1 голос
/ 05 августа 2020

Попробуем pct_change

s=1+df.groupby(['id','variable']).value.pct_change().bfill()
df.loc[df.variable=='a','value']=s
df
Out[52]: 
    id variable  year     value
0    1        a    20  1.000000
1    1        a    21  1.000000
2    1        a    22  1.090909
3    2        a    20  0.600000
4    2        a    21  0.600000
5    2        a    22  0.333333
6    1        b    20  1.100000
7    1        b    21  1.100000
8    1        b    22  1.200000
9    2        b    20  0.500000
10   2        b    21  0.300000
11   2        b    22  0.100000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...