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。谢谢!
用:
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)
仅通过更大的值过滤掩码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
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)
归档时间: |
|
查看次数: |
873 次 |
最近记录: |