我有一个像这样的数据框。
id time status
-- ---- ------
a 1 T
a 2 F
b 1 T
b 2 T
a 3 T
a 4 T
b 3 F
b 4 T
b 5 T
我想获取在一定阈值次数内(状态为2)连续具有状态“ T”的ID。
因此,获取的行将是...
id time status
-- ---- ------
b 1 T
b 2 T
a 3 T
a 4 T
b 4 T
b 5 T
我可以想到一个迭代解决方案。我正在寻找的是类似pandas / sql的东西。我认为按id
然后按time
排序,然后按组先按id
然后按status
排序应该可以,但是我想确定。 >
答案 0 :(得分:2)
用Series.eq
比较T
的值,并用Series.shift
和Series.cumsum
计数连续的值,用Series.value_counts
和Series.map
计数到原始值-获取每个连续组的计数。然后按Series.ge
比较,最后按boolean indexing
过滤,按位AND
链接两个掩码:
N = 2
m1 = df['status'].eq('T')
g = df['status'].ne(df['status'].shift()).cumsum()
m2 = g.map(g.value_counts()).ge(N)
df = df[m1 & m2]
print (df)
id time status
2 b 1 T
3 b 2 T
4 a 3 T
5 a 4 T
7 b 4 T
8 b 5 T
详细信息:
print (df.assign(m1=m1, g=g, counts=g.map(g.value_counts()), m2=m2))
id time status m1 g counts m2
0 a 1 T True 1 1 False
1 a 2 F False 2 1 False
2 b 1 T True 3 4 True
3 b 2 T True 3 4 True
4 a 3 T True 3 4 True
5 a 4 T True 3 4 True
6 b 3 F False 4 1 False
7 b 4 T True 5 2 True
8 b 5 T True 5 2 True