在分组依据组行上使用过滤器进行条件滚动总和

时间:2018-12-27 00:12:51

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

我一直在尝试没有成功的方法,试图找到一种在python中创建“ average_gain_up”的方法,并且有点卡住了。对groupby来说是新手,它在如何处理我尚未设法掌握的功能方面有些东西,因此如何思考这些类型的问题背后的任何直觉都将有所帮助。

问题: 创建滚动的14天总和,仅当值> 0时才求和。

new=pd.DataFrame([[1,-2,3,-2,4,5],['a','a','a','b','b','b']])
new= new.T #transposing into a friendly groupby format

#Group by a or b, filter to only have positive values and then sum rolling, we 
keep NAs to ensure the sum is ran over 14 values. 
groupby=new.groupby(1)[0].filter(lambda x: x>0,dropna=False).rolling(14).sum()

frame

预期总和框架:

enter image description here

x.all()/ len(x)结果:

enter image description here

这将引发类型错误“过滤器必须返回布尔结果”。 通过阅读其他答案,我明白了,我在问一个系列/框架是否优于0。 上面的代码适用于len(x),在这种情况下也是有意义的。

我也尝试过all(),但是它的行为不符合预期。 .all()函数为每个组返回一个布尔值,然后总和就是一个简单的滚动总和。

我尝试创建一个布尔值列表,以说明哪些值是正值,哪些不是,但这也会产生错误,这一次我不确定为什么。

groupby1=new.groupby(1)[0]
groupby2=[y>0 for x in groupby1 for y in x[1] ]
groupby_try=new.groupby(1)[0].filter(lambda x:groupby2,dropna=False).rolling(2).sum()

1)我如何使上面的代码起作用,我在想什么呢?

2)这是进行此类操作的“最佳实践”方法吗?

任何帮助表示赞赏,如果我有任何遗漏或需要进一步澄清,请告诉我。

1 个答案:

答案 0 :(得分:1)

根据groupby之后filter上的文档,不应将filter的值放在一个组中,而是将整个组(如果它们不满足某些条件)进行分组,例如就像该组中所有元素的sum都大于2一样,则该组将保留在给定的第一个示例中

一种方法可能是先在new[0]中将所有负值替换为0,例如使用np.clip,然后再使用groupbyrolling和{{1} },例如

sum

这种方法可以防止修改print (np.clip(new[0],0,np.inf).groupby(new[1]).rolling(2).sum()) 1 a 0 NaN 1 1.0 2 3.0 b 3 NaN 4 4.0 5 9.0 Name: 0, dtype: float64 中的数据,如果您不介意,可以使用new更改列0,然后执行new[0] = np.clip(new[0],0,np.inf)来得到相同的结果。 / p>