计算具有特定值的行后面的两行

时间:2017-02-01 19:59:00

标签: python pandas

我有一个带有1和NaN值的数据框,并希望计算两行之后的两行。

import pandas as pd
df=pd.DataFrame({"b" : [1,None,None,None,None,1,None,None,None]})
print(df)

      b
0   1.0
1   NaN
2   NaN
3   NaN
4   NaN
5   1.0
6   NaN
7   NaN
8   NaN

像这样:

      b
0   1.0
1   2.0
2   3.0
3   NaN
4   NaN
5   1.0
6   2.0
7   3.0
8   NaN

我知道我可以使用df.loc[df['b']==1]来检索那些但我不知道如何计算下面的两行。

3 个答案:

答案 0 :(得分:3)

您可以创建一个组变量,其中b中的每个1开始一个新组,然后为每个组转发2行,然后执行cumsum

g = (df.b == 1).cumsum()
df.b.groupby(g).apply(lambda g: g.ffill(limit = 2).cumsum())

#0    1.0
#1    2.0
#2    3.0
#3    NaN
#4    NaN
#5    1.0
#6    2.0
#7    3.0
#8    NaN
#Name: b, dtype: float64

答案 1 :(得分:2)

没有groupby的人:

temp = df.ffill(limit=2).cumsum()
temp-temp.mask(df.b.isnull()).ffill(limit=2)+1

Out[91]: 
     b
0  1.0
1  2.0
2  3.0
3  NaN
4  NaN
5  1.0
6  2.0
7  3.0
8  NaN

答案 2 :(得分:0)

使用您当前的思路,您只需要在1之后的行索引并设置为适当的值:

df.loc[np.where(df['b']==1)[0]+1, 'b'] = 2
df.loc[np.where(df['b']==1)[0]+2, 'b'] = 3