首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >熊猫的数据范围检查使用之间和滚动

熊猫的数据范围检查使用之间和滚动
EN

Stack Overflow用户
提问于 2021-08-12 16:26:55
回答 2查看 58关注 0票数 0

我必须考虑第n行并检查n+1到n+3行,如果它在(第n行值)-0.5到(第n行值)+0.5的范围内,则and(&)为3行的结果。

代码语言:javascript
运行
复制
    A    result
0   1.1     1      # 1.2 1.3 and 1.5 are in range of 0.6 to 1.6, ( 1 & 1 & 1)
1   1.2     0      # 1.3 and 1.5 are in range of 0.7 to 1.7, but not 2, hence ( 1 & 0 & 0)  
2   1.3     0      # 1.5 and 1 are in range of 0.8 to 1.8, but not 2 ( 1 & 0 & 1)
3   1.5     
4   2.0  
5   1.0     
6   2.5     
7   1.8  
8   4.0     
9   4.2  
10  4.5     
11  3.9     

df = pd.DataFrame( {
   'A': [1.1,1.2,1.3,1.9,2,1,2.5,1.8,4,4.2,4.5,3.9]
    } )

我在网站上做了一些研究,但是找不到确切的语法。我尝试使用rolling函数获取3行,并使用between函数检查范围,然后对结果进行and。你能帮帮我吗。

代码语言:javascript
运行
复制
s = pd.Series([1, 2, 3, 4])
s.rolling(2).between(s-1,s+1)

获取错误: AttributeError:“滚动”对象之间没有属性

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-08-12 16:54:09

您还可以在不使用rolling()的情况下实现此结果,同时继续使用.between(),如下所示:

代码语言:javascript
运行
复制
df['result'] =  (
                    (df['A'].shift(-1).between(df['A'] - 0.5, df['A'] + 0.5)) & 
                    (df['A'].shift(-2).between(df['A'] - 0.5, df['A'] + 0.5)) & 
                    (df['A'].shift(-3).between(df['A'] - 0.5, df['A'] + 0.5))
                ).astype(int)

结果:

代码语言:javascript
运行
复制
print(df)

      A  result
0   1.1       1
1   1.2       0
2   1.3       0
3   1.5       0
4   2.0       0
5   1.0       0
6   2.5       0
7   1.8       0
8   4.0       1
9   4.2       0
10  4.5       0
11  3.9       0
票数 0
EN

Stack Overflow用户

发布于 2021-08-12 17:09:34

在熊猫中,滚动的窗户往往是相当缓慢的。一个快速的解决方案可以是生成带有每行窗口值的数据文件:

代码语言:javascript
运行
复制
df_temp = pd.concat([df['A'].shift(i) for i in range(-1, 2)], axis=1)
df_temp
      A    A    A
0   1.2  1.1  NaN
1   1.3  1.2  1.1
2   1.9  1.3  1.2
3   2.0  1.9  1.3
4   1.0  2.0  1.9
5   2.5  1.0  2.0
6   1.8  2.5  1.0
7   4.0  1.8  2.5
8   4.2  4.0  1.8
9   4.5  4.2  4.0
10  3.9  4.5  4.2
11  NaN  3.9  4.5

然后,如果该值在所需范围内,则可以检查每一行:

代码语言:javascript
运行
复制
df['result'] = df_temp.apply(lambda x: (x - x.iloc[0]).between(-0.5, 0.5), axis=1).all(axis=1).astype(int)

      A  result
0   1.1       0
1   1.2       1
2   1.3       0
3   1.9       0
4   2.0       0
5   1.0       0
6   2.5       0
7   1.8       0
8   4.0       0
9   4.2       1
10  4.5       0
11  3.9       0
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68761100

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档