Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
选择3个连续值与条件匹配的行-Python,Pandas_Python_Pandas_Dataframe - Fatal编程技术网

选择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)