关键字:groupby、shift、mean
代码:
df_result=df.groupby((df['B'].shift(1,fill_value=0)!= df['B']).cumsum()).mean()
df_result=df_result[df_result['B']!=0]
df_result
A B
1 2.0 1.0
3 3.0 1.0
您可能已经注意到,您首先需要确定具有相同值的连续行块。
一种方法是将 B 移动一行,然后将其与自身进行比较。
df['B_shifted']=df['B'].shift(1,fill_value=0) # fill_value=0 to return int and replace Nan with 0's
df['A'] =[2, 3, 1, 2, 4, 1, 5, 3, 1, 7, 5]
df['B'] =[0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0]
df['B_shifted'] =[0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0]
(df['B_shifted'] != df['B'])=[F, T, F, F, T, F, T, F, F, T, F]
[↑ ][↑ ][↑ ][↑ ]
现在我们可以使用 groupby pandas 方法如下:
df_grouped=df.groupby((df['B_shifted'] != df['B']).cumsum())
现在,如果我们循环进入 DtaFrameGroupBy 对象 df_grouped
我们将看到以下元组:
(0, A B B_shifted
0 2 0 0)
(1, A B B_shifted
1 3 1 0
2 1 1 1
3 2 1 1)
(2, A B B_shifted
4 4 0 1
5 1 0 0)
(3, A B B_shifted
6 5 1 0
7 3 1 1
8 1 1 1)
(4, A B B_shifted
9 7 0 1
10 5 0 0)
我们现在可以简单地计算平均值并过滤零值,如下所示
df_result=df_grouped.mean()
df_result=df_result[df_result['B']!=0][['A','B']]