选择 3 个连续值匹配条件的行 - Python、Pandas

Luc*_*a91 3 python dataframe pandas

我有一个数据框,如:

   values
0   45
1   47
2   58
3   40
4   45
5   40
6   50
7   55
8   60
9   60
10  20
...
Run Code Online (Sandbox Code Playgroud)

我想获得一个仅包含 3 个连续值大于特定数字的行的数据框,假设大于 44。结果 df 将是:

  values
0   45
1   47
2   58
6   50
7   55
8   60
9   60
...
Run Code Online (Sandbox Code Playgroud)

请注意 index=3 中的 value=45 已被排除,因为没有 3 个连续的值大于 44。谢谢!

jez*_*ael 6

用:

A = 44
B = 3

m = df['values'].gt(A)
s = (~m).cumsum()[m]
df1 = df[s.map(s.value_counts()).ge(B).reindex(df.index, fill_value=False)]
print (df1)
   values
0      45
1      47
2      58
6      50
7      55
8      60
9      60
Run Code Online (Sandbox Code Playgroud)

说明/细节:

首先比较Series.gt更大:

print (df['values'].gt(A))
0      True
1      True
2      True
3     False
4      True
5     False
6      True
7      True
8      True
9      True
10    False
Name: values, dtype: bool
Run Code Online (Sandbox Code Playgroud)

然后Series.cumsum使用反向掩码创建组~

print ((~m).cumsum())
0     0
1     0
2     0
3     1
4     1
5     2
6     2
7     2
8     2
9     2
10    3
Name: values, dtype: int32
Run Code Online (Sandbox Code Playgroud)

仅通过更大的值过滤掩码mby boolean indexing

print ((~m).cumsum()[m])
0    0
1    0
2    0
4    1
6    2
7    2
8    2
9    2
Name: values, dtype: int32
Run Code Online (Sandbox Code Playgroud)

比较第二个值 bySeries.ge以获得更大的 od 等于:

print (s.map(s.value_counts()).ge(B))
0     True
1     True
2     True
4    False
6     True
7     True
8     True
9     True
Name: values, dtype: bool
Run Code Online (Sandbox Code Playgroud)

最后添加过滤掉行Series.reindex,所以可能过滤boolean indexing

print (s.map(s.value_counts()).ge(B).reindex(df.index, fill_value=False))
0      True
1      True
2      True
3     False
4     False
5     False
6      True
7      True
8      True
9      True
10    False
Name: values, dtype: bool
Run Code Online (Sandbox Code Playgroud)