熊猫:GroupBy转移和累积总和

问题描述 投票:2回答:2

我想做groupbyshiftcumsum这看起来很琐碎的任务,但仍然对我得到的结果感到震惊。有人可以告诉我我做错了什么。我在网上找到的所有结果都显示了我正在做的相同或相同的变化。以下是我的实施。

temp = pd.DataFrame(data=[['a',1],['a',1],['a',1],['b',1],['b',1],['b',1],['c',1],['c',1]], columns=['ID','X'])

temp['transformed'] = temp.groupby('ID')['X'].cumsum().shift()
print(temp)

   ID   X   transformed
0   a   1   NaN
1   a   1   1.0
2   a   1   2.0
3   b   1   3.0
4   b   1   1.0
5   b   1   2.0
6   c   1   3.0
7   c   1   1.0

这是错误的,因为实际或我正在寻找的如下:

   ID   X   transformed
0   a   1   NaN
1   a   1   1.0
2   a   1   2.0
3   b   1   NaN
4   b   1   1.0
5   b   1   2.0
6   c   1   NaN
7   c   1   1.0

非常感谢提前。

python-3.x pandas pandas-groupby
2个回答
3
投票

您可以使用transform()将在groupby的每个级别创建的单独组提供给cumsum()shift()方法。

temp['transformed'] = \
    temp.groupby('ID')['X'].transform(lambda x: x.cumsum().shift())
  ID  X   transformed
0  a  1   NaN
1  a  1   1.0
2  a  1   2.0
3  b  1   NaN
4  b  1   1.0
5  b  1   2.0
6  c  1   NaN
7  c  1   1.0

有关transform()的更多信息,请参阅此处:


3
投票

你需要使用apply,因为一个函数在groupby object下是cumsum另一个函数shift适用于所有df

temp['transformed'] = temp.groupby('ID')['X'].apply(lambda x  : x.cumsum().shift())
temp
Out[287]: 
  ID  X  transformed
0  a  1          NaN
1  a  1          1.0
2  a  1          2.0
3  b  1          NaN
4  b  1          1.0
5  b  1          2.0
6  c  1          NaN
7  c  1          1.0
© www.soinside.com 2019 - 2024. All rights reserved.