在Python中,我希望检测DataFrame值块在一行中的起始和结束位置。如果这个块只包含一个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`.发布于 2018-08-01 06:36:39
使用:
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只使用带倒置布尔列的False行通过boolean indexing过滤:
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函数对每个组进行聚合,first和last
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]]https://stackoverflow.com/questions/51626733
复制相似问题