【问题标题】:Pandas: GroupBy Shift And Cumulative Sum熊猫:GroupBy Shift 和累积和
【发布时间】:2019-07-26 08:16:03
【问题描述】:

我想做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

非常感谢。

【问题讨论】:

  • temp2 = temp.groupby('ID').shift() temp2['ID'] = temp['ID'] temp2.​​groupby('ID').cumsum() 虽然是只是一个快速而肮脏的黑客。我更喜欢 Wen-Bens 的回答。

标签: python-3.x pandas pandas-groupby


【解决方案1】:

您可以使用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() 的更多信息,请参见此处:

【讨论】:

  • 感谢您的帮助和链接,以便更好地了解转换的工作原理。
【解决方案2】:

您需要使用 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

【讨论】:

  • 感谢您的帮助和解释
【解决方案3】:

在解决这个问题时,随着 DataFrame 大小的增长,在转换中使用 lambda 开始变得非常缓慢。我发现使用一些 DataFrameGroupBy 方法(如 cumsumshift 而不是 lambda 会快得多。

所以这是我提出的解决方案,创建一个'temp' 列来保存每个 ID 的 cumsum,然后转移到不同的 groupby:

df['temp'] = df.groupby("ID")['X'].cumsum()
df['transformed'] = df.groupby("ID")['temp'].shift()
df = df.drop(columns=["temp"])

【讨论】:

  • 我同意你的看法。是的,这是一个很酷的技巧
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-09
  • 2017-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-01
相关资源
最近更新 更多