我正在使用此处显示的示例中的数据: 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)
此代码给出了如上所示的预期结果。
我已经尝试过使用转换的不同变体,但是还没有像我在弃用之前那样在一行中编写代码。是否有单行语法可行?感谢。
答案 0 :(得分:0)
看来你需要一个cumsum:
df.groupby('A')['B'].cumsum()
答案 1 :(得分:0)
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后,很明显警告所说的Series
是pd.expanding_sum
的第一个参数。即在我们的例子中,它是x
。
现在我们应用警告中建议的代码转换。因此pd.expanding_sum(x)
变为x.expanding(min_periods=1).sum()
。
根据Pandas 0.22.0: pandas.Series.expanding min_periods
的默认值为1
,因此在您的情况下可以完全省略,因此最终结果。