首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何检测DataFrame中某些值的条纹?

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

Stack Overflow用户
提问于 2018-08-01 06:33:09
回答 1查看 179关注 0票数 2

在Python中,我希望检测DataFrame值块在一行中的起始和结束位置。如果这个块只包含一个False,我想得到这个位置。

示例:

代码语言:javascript
运行
复制
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

在这个例子中,我想得到这些职位

代码语言:javascript
运行
复制
`3`, `5`

代码语言:javascript
运行
复制
`7`, `7`.
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-01 06:36:39

使用:

代码语言:javascript
运行
复制
a = (df.a.cumsum()[~df.a]
         .reset_index()
         .groupby('a')['index']
         .agg(['first','last'])
         .values
         .tolist())
print(a)
[[3, 5], [7, 7]]

解释

首先,通过cumsum获得所有False唯一组的累积和:

代码语言:javascript
运行
复制
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过滤:

代码语言:javascript
运行
复制
print (df.a.cumsum()[~df.a])
3    3
4    3
5    3
7    4
Name: a, dtype: int32

通过reset_index从索引中创建列

代码语言:javascript
运行
复制
print (df.a.cumsum()[~df.a].reset_index())
   index  a
0      3  3
1      4  3
2      5  3
3      7  4

agg函数对每个组进行聚合,firstlast

代码语言:javascript
运行
复制
print (df.a.cumsum()[~df.a].reset_index().groupby('a')['index'].agg(['first','last']))
   first  last
a             
3      3     5
4      7     7

最后一次转换为嵌套list

代码语言:javascript
运行
复制
print (df.a.cumsum()[~df.a].reset_index().groupby('a')['index'].agg(['first','last']).values.tolist())
[[3, 5], [7, 7]]
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51626733

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档