我有一张像这样的数据
import pandas as pd
df = pd.DataFrame({
'column': [0,0,1,1,1,2,2,2,2,1,1,]
})
column
0 0
1 0
2 1
3 1
4 1
5 2
6 2
7 2
8 2
9 1
10 1我感兴趣的是识别与某些条件相匹配的所有连续序列(例如,索引数中没有跳变),后者是琐碎的。
df[df['column'] == 1]
column
2 1
3 1
4 1
9 1
10 1下一步是将索引2-4和9-10识别为两个离散实体。我可以(并且已经)使用这样的逻辑来创建一个常规python循环(不需要索引,只是提取序列本身的一种方法)
[(2,4), (9,10)]但这似乎是不必要的,我想知道是否有人有一个更“熊猫”/有效的方法?
发布于 2022-08-31 18:53:21
您可以使用:
# group by consecutive values
g = df['column'].ne(df['column'].shift()).cumsum()
# identify rows with "1"
m = df['column'].eq(1)
out = (df[m]
.groupby(g, sort=False)
.apply(lambda g: (g.index[0], g.index[-1]))
.tolist()
)输出:[(2, 4), (9, 10)]
发布于 2022-08-31 19:10:43
确定目标群体,包括:
grp = df['column'].diff().ne(0).cumsum()然后按这些进行分组,为每一组首先和最后一次索引。然后只选择组1并转换为列表:
df.groupby(['column',grp]).apply(lambda x: (x.index[0],x.index[-1])).xs(1).to_list()结果
[(2, 4), (9, 10)]https://stackoverflow.com/questions/73560576
复制相似问题