如何检测DataFrame中某些值的条纹?

时间:2018-08-01 06:33:10

标签: python pandas dataframe

在Python DataFrame中,我想检测一行False值的块的开始和结束位置。如果该代码块仅包含一个False,我想获得该职位。

示例:

df = pd.DataFrame({"a": [True, True, True,False,False,False,True,False,True],})
In[110]: df
Out[111]: 
       a
0   True
1   True
2   True
3  False
4  False
5  False
6   True
7  False
8   True

在此示例中,我想获得职位

`3`, `5`

`7`, `7`.

1 个答案:

答案 0 :(得分:2)

使用:

a = (df.a.cumsum()[~df.a]
         .reset_index()
         .groupby('a')['index']
         .agg(['first','last'])
         .values
         .tolist())
print(a)
[[3, 5], [7, 7]]

说明

首先按cumsum获取累积总和-获取所有False个唯一组:

print (df.a.cumsum())
0    1
1    2
2    3
3    3
4    3
5    3
6    4
7    4
8    5
Name: a, dtype: int32

仅按boolean indexing过滤False行,并使用反转布尔列:

print (df.a.cumsum()[~df.a])
3    3
4    3
5    3
7    4
Name: a, dtype: int32

通过reset_index从索引创建列:

print (df.a.cumsum()[~df.a].reset_index())
   index  a
0      3  3
1      4  3
2      5  3
3      7  4

对于每个由agg个功能firstlast组成的组:

print (df.a.cumsum()[~df.a].reset_index().groupby('a')['index'].agg(['first','last']))
   first  last
a             
3      3     5
4      7     7

最后转换为嵌套的list

print (df.a.cumsum()[~df.a].reset_index().groupby('a')['index'].agg(['first','last']).values.tolist())
[[3, 5], [7, 7]]
相关问题