Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
565 views
in Technique[技术] by (71.8m points)

python - In pandas how to calculate 'Countif' on a moving window basis?

Given

A = pd.DataFrame([[1, 5, -2], [2, 4, -4], [3, 3, -1], [4, 2, 2], [5, 1, 4]],
             columns=['A', 'B', 'C'], index=[1, 2, 3, 4, 5])

Say you want to calculate the number observations < 0 in the column C over the last 3 observations on a rolling basis. In excel you would slide a 'countif' calculation over a specified window with the condition and the desired result would be:

D = # of x < 0 on a rolling window basis of size 3

A
Out[79]: 
   A  B  C  D
1  1  5 -2  
2  2  4 -4
3  3  3 -1  3
4  4  2  2  2
5  5  1  4  1

How can I do this in an efficient(Pythonic) way using Pandas?

Thanks

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

You can use rolling_sum on a column of bools:

>>> A["D"] = pd.rolling_sum((A["C"] < 0), 3)
>>> A
   A  B  C   D
1  1  5 -2 NaN
2  2  4 -4 NaN
3  3  3 -1   3
4  4  2  2   2
5  5  1  4   1

This works because True ~ 1 and False ~ 0, and we have

>>> A["C"] < 0
1     True
2     True
3     True
4    False
5    False
Name: C, dtype: bool

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...