python - 选择 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。谢谢!
解决方案
利用:
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
推荐阅读
- ios - 被杀死的应用程序如何接收firebase消息
- r - ggplot2 合并数据框并绘图
- python - 图像匹配导致图像不应该是一个(Python opencv 教程)
- php - Add this loop into col-4 bootstrap grid layout
- angular - 如何使打字稿显式地评估胖箭头函数?
- go - Using function argument (parameter) in a constant context in Go
- amazon-web-services - 带有 USER_PASSWORD_AUTH 的 AWS Cognito 自定义身份验证流程
- azure-devops - 如何在 Web 部署 zip 中包含我的配置转换文件?
- c++ - 为什么 G++ 不警告 Const 成员的未使用结果?
- ios - 每列都有最后一列的值。SQLITE 数据库