Python Pandas在groupby内按单元格中的给定值移位

zu0ti5jz  于 2023-02-27  发布在  Python
关注(0)|答案(2)|浏览(144)

给定以下 Dataframe

df = pd.DataFrame(data={'name': ['a', 'a', 'a', 'b', 'b', 'b', 'b', 'c', 'c', 'c'],
                        'lag': [1, 1, 1, 2, 2, 2, 2, 2, 2, 2],
                        'value': range(10)})

print(df)

   lag name  value
0    1    a      0
1    1    a      1
2    1    a      2
3    2    b      3
4    2    b      4
5    2    b      5
6    2    b      6
7    2    c      7
8    2    c      8
9    2    c      9

我试图移动value列中包含的值以获得expected_value列,它是按name列分组并按lag行移动的值。我想使用类似df['expected_value'] = df.groupby(['name', 'lag']).shift()的东西,但我不确定如何将lag传递给shift()函数。

print(df)

   lag name  value  expected_value
0    1    a      0             nan
1    1    a      1          0.0000
2    1    a      2          1.0000
3    2    b      3             nan
4    2    b      4             nan
5    2    b      5          3.0000
6    2    b      6          4.0000
7    2    c      7             nan
8    2    c      8             nan
9    2    c      9          7.0000
kfgdxczn

kfgdxczn1#

您可以在这里使用GroupBy.transform

df.assign(expected_value = df.groupby(['name', 'lag'])['value'].
                              transform(lambda x: x.shift(x.name[1])))

  name  lag  value  expected_value
0    a    1      0             NaN
1    a    1      1             0.0
2    a    1      2             1.0
3    b    2      3             NaN
4    b    2      4             NaN
5    b    2      5             3.0
6    b    2      6             4.0
7    c    2      7             NaN
8    c    2      8             NaN
9    c    2      9             7.0
h79rfbju

h79rfbju2#

您可以使用apply

df['new_val'] = (df.groupby('name')
   .apply(lambda x: x['value'].shift(x['lag'].iloc[0]))
   .reset_index('name',drop=True)
)

输出:

name  lag  value  new_val
0    a    1      0      NaN
1    a    1      1      0.0
2    a    1      2      1.0
3    b    2      3      NaN
4    b    2      4      NaN
5    b    2      5      3.0
6    b    2      6      4.0
7    c    2      7      NaN
8    c    2      8      NaN
9    c    2      9      7.0

相关问题