Pandas groupby扩展语法优化

时间:2017-05-30 00:55:12

标签: python pandas

我正在使用此处显示的示例中的数据: http://pandas.pydata.org/pandas-docs/stable/groupby.html。转到子标题:窗口和重新采样操作的新语法

在命令提示符下,新语法的工作方式如pandas文档中所示。但我想在现有数据框中添加一个包含扩展数据的新列,就像在已保存的程序中一样。

在通过扩展代码语法升级到groupby之前,我能够使用以下单行代码:

df = pd.DataFrame({'A': [1] * 10 + [5] * 10, 'B': np.arange(20)})
df['Sum of B'] = df.groupby('A')['B'].transform(lambda x: pd.expanding_sum(x))

这给出了预期的结果,但也提供了不推荐使用的expand_sum'信息。预期结果如下:

    A   B  Sum of B
0   1   0         0
1   1   1         1
2   1   2         3
3   1   3         6
4   1   4        10
5   1   5        15
6   1   6        21
7   1   7        28
8   1   8        36
9   1   9        45
10  5  10        10
11  5  11        21
12  5  12        33
13  5  13        46
14  5  14        60
15  5  15        75
16  5  16        91
17  5  17       108
18  5  18       126
19  5  19       145

我想使用新语法来替换不推荐使用的语法。如果我尝试新语法,我会收到错误消息:

df['Sum of B'] = df.groupby('A').expanding().B.sum()

TypeError: incompatible index of inserted column with frame index

我在这里做了一些搜索,看到了一些可能有帮助的东西,但它给了我一个不同的信息:

df['Sum of B'] = df.groupby('A').expanding().B.sum().reset_index(level = 0)

ValueError: Wrong number of items passed 2, placement implies 1

我可以让它工作的唯一方法是将结果分配给临时df,然后将临时df合并到原始df中:

temp_df = df.groupby('A').expanding().B.sum().reset_index(level = 0).rename(columns = {'B' : 'Sum of B'})
new_df = pd.merge(df, temp_df, on = 'A', left_index = True, right_index = True)
print (new_df)

此代码给出了如上所示的预期结果。

我已经尝试过使用转换的不同变体,但是还没有像我在弃用之前那样在一行中编写代码。是否有单行语法可行?感谢。

2 个答案:

答案 0 :(得分:0)

看来你需要一个cumsum:

df.groupby('A')['B'].cumsum()

答案 1 :(得分:0)

TL; DR

df['Sum of B'] = df.groupby('A')['B'].transform(lambda x: x.expanding().sum())

解释

我们从违规行开始:

df.groupby('A')['B'].transform(lambda x: pd.expanding_sum(x))

让我们仔细阅读您提到的警告:

  

FutureWarning:pd.expanding_sum已弃用于系列,并且将会   在将来的版本中删除,替换为     Series.expanding(min_periods = 1)的.sum()

阅读Pandas 0.17.0: pandas.expanding_sum后,很明显警告所说的Seriespd.expanding_sum的第一个参数。即在我们的例子中,它是x

现在我们应用警告中建议的代码转换。因此pd.expanding_sum(x)变为x.expanding(min_periods=1).sum()

根据Pandas 0.22.0: pandas.Series.expanding min_periods的默认值为1,因此在您的情况下可以完全省略,因此最终结果。