首页 > 解决方案 > 选择 3 个连续值匹配条件的行 - Python、Pandas

问题描述

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

   values
0   45
1   47
2   58
3   40
4   45
5   40
6   50
7   55
8   60
9   60
10  20
...

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

  values
0   45
1   47
2   58
6   50
7   55
8   60
9   60
...

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

标签: pythonpandasdataframe

解决方案


利用:

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

解释/细节:

首先比较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

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

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

m使用by仅通过更大的值过滤掩码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

通过第二个值比较Series.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

最后添加过滤行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

推荐阅读