选择3个连续值与条件匹配的行-Python,Pandas
我有一个数据帧,如:选择3个连续值与条件匹配的行-Python,Pandas,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个数据帧,如: 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)的行。 结果将是: values 0 45 1 47 2 58 6 50 7 55 8 60 9 60 ... 请注意,索引=3中的值=45已被排除,因为没有3个连续值大于44。 谢谢大家!
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)的行。
结果将是:
values
0 45
1 47
2 58
6 50
7 55
8 60
9 60
...
请注意,索引=3中的值=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
解释/详情:
首先,通过以下方式进行比较:
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
然后使用反向遮罩创建组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
仅通过更大的值过滤遮罩:
按第二个值进行比较,以获得更大的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
最后添加筛选行依据,因此可能的筛选依据:
如果之前的2个值、之后的2个值或每个值中的一个满足条件,我不确定您是否希望保留一行,但您可以按照滚动窗口的思路进行操作:
testVal=42
df.loc[(df['values']>testVal).rolling(3,center=True.sum()=3]
您可能需要使用其他窗口(请参见)尝试使用:
print(df[df.groupby(df['values'].gt(44).ne(df['values'].gt(44).shift()).cumsum()).transform('count').gt(1)].dropna())
输出:
values
0 45.0
1 47.0
2 58.0
6 50.0
7 55.0
8 60.0
9 60.0
请检查这是否对您有帮助
print(df[df.groupby(df['values'].gt(44).ne(df['values'].gt(44).shift()).cumsum()).transform('count').gt(1)].dropna())
values
0 45.0
1 47.0
2 58.0
6 50.0
7 55.0
8 60.0
9 60.0
for i in df.index:
value = df['values'][i]
if(value > 44 and i == 0):
print(value)
elif(value > 44 and i > 0):
before = df['values'][i-1]
after = df['values'][i+1]
if(before > 44 and after > 44):
print(value)
print(before)
print(after)