查找大熊猫系列

时间:2017-11-24 09:46:51

标签: python pandas

我正在开发一个pandas数据帧

D=pd.DataFrame(data=[1.0,2.0,2.0,2.0,5.0,3.0,2.0,2.0,5.0,5.0,8.0,1.0]) 

我确定低于特定阈值的值

a=D<4.0

我可以计算条件的True值的连续出现次数:

df1 = a.cumsum()-a.cumsum().where(~a).ffill().fillna(0).astype(int) 

的产率:

df1
Out[121]: 
    0
0   1
1   2
2   3
3   4
4   0
5   1
6   2
7   3
8   0
9   0
10  0
11  1

现在我想转换df1以获取具有的数据帧 True如果满足条件的连续元素的数量是3或更多,False则是3或更少。我试过了

df1.loc[:,'part of interest']=df1.values>3.0

这导致:

        0  part of interest
0   1                  False
1   2                  False
2   3                  False
3   4                   True
4   0                  False
5   1                  False
6   2                  False
7   3                  False
8   0                  False
9   0                  False
10  0                  False
11  1                  False

这是正确的。我只需要为所有元素(0,1,2,3)设置True值,而不仅仅是那些值在上面的值。 期望的输出:

 0  part of interest
0   1                  **True**
1   2                  **True**
2   3                  **True**
3   4                   True
4   0                  False
5   1                  False
6   2                  False
7   3                  False
8   0                  False
9   0                  False
10  0                  False
11  1                  False

1 个答案:

答案 0 :(得分:1)

您可以先区分每个连续的组,然后按value_counts区分map,但先删除0个值:

b = a.ne(a.shift()).cumsum() * a
m = b[0].map(b[0].mask(b[0] == 0).value_counts()) > 3

df1 = a.cumsum()-a.cumsum().where(~a).ffill().fillna(0).astype(int) 
df1['part of interest'] = m
print (df1)
    0  part of interest
0   1              True
1   2              True
2   3              True
3   4              True
4   0             False
5   1             False
6   2             False
7   3             False
8   0             False
9   0             False
10  0             False
11  1             False

详情:

print (b)
    0
0   1
1   1
2   1
3   1
4   0
5   3
6   3
7   3
8   0
9   0
10  0
11  5

print (b[0].mask(b[0] == 0).value_counts())
1.0    4
3.0    3
5.0    1
Name: 0, dtype: int64

print (b[0].map(b[0].mask(b[0] == 0).value_counts()))
0     4.0
1     4.0
2     4.0
3     4.0
4     NaN
5     3.0
6     3.0
7     3.0
8     NaN
9     NaN
10    NaN
11    1.0
Name: 0, dtype: float64