我正在开发一个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
答案 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