熊猫:获取连续具有相似值的行

时间:2020-02-07 06:54:24

标签: sql python-3.x pandas

我有一个像这样的数据框。

      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排序应该可以,但是我想确定。 >

1 个答案:

答案 0 :(得分:2)

Series.eq比较T的值,并用Series.shiftSeries.cumsum计数连续的值,用Series.value_countsSeries.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