首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何根据每列的数学运算,从2列中提取数值范围?

如何根据每列的数学运算,从2列中提取数值范围?
EN

Stack Overflow用户
提问于 2017-01-26 12:20:23
回答 1查看 104关注 0票数 0

使用用于python的熊猫数据框架,并基于前面的一个问题(How to extract numeric ranges from 2 columns containig numeric sequences and print the range from both columns (different increment values)?);得到了以下问题:是否有一种方法可以使用熊猫数据框架为每一列创建基于不同数学操作的数值范围?

例如:

代码语言:javascript
运行
复制
col1    col2   criteria-col1 diff. >2     criteria-col2 diff<=3                
1       23    abs(2-1)=1 ; no break     abs(27-23)=4;no break          
2       27    abs(4-2)=2 ; no break     abs(31-27)=4;no break
4       31    abs(6-4)=2;  no break     abs(35-31)=4;no break
6       35    abs(9-6)=3; break            abs(40-35)=5; no break but still break due to col1 criteria
9       40    abs(11-9)=2; no break    abs(45-40)=5;no break
11      45    abs(13-11)=2;no break    abs(49-45)=4;no break
13      49    abs (51-49)=2;no break   abs (51-49)=2; break also in column 1 due to critera in col2
15      51  

标准:创建数值范围,其中序列(升序或降序)由任何值>2组成。

条件:创建数值范围,其中数值序列(升序或降序)由任何值<=3重新排列

预期的结果应该是按照上面所示的标准,序列破坏的范围:

代码语言:javascript
运行
复制
col1_from  col1_to   col2_from  col2_to
        1        6          23       35
        9       13          40       49
       15       15          51       51
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-27 10:14:44

数据:

代码语言:javascript
运行
复制
In [10]: df
Out[10]:
   col1  col2
0     1    23
1     2    27
2     4    31
3     6    35
4     9    40
5    11    45
6    13    49
7    15    51

解决方案:

代码语言:javascript
运行
复制
In [11]: df.groupby(df.diff().abs().eval("col1 > 2 or col2 <= 3").cumsum()) \
           .agg(['min','max'])
Out[11]:
  col1     col2
   min max  min max
0    1   6   23  35
1    9  13   40  49
2   15  15   51  51

解释:

代码语言:javascript
运行
复制
In [12]: df.diff()
Out[12]:
   col1  col2
0   NaN   NaN
1   1.0   4.0
2   2.0   4.0
3   2.0   4.0
4   3.0   5.0
5   2.0   5.0
6   2.0   4.0
7   2.0   2.0

In [13]: df.diff().abs().eval("col1 > 2 or col2 <= 3")
Out[13]:
0    False
1    False
2    False
3    False
4     True
5    False
6    False
7     True
dtype: bool

In [14]: df.diff().abs().eval("col1 > 2 or col2 <= 3").cumsum()
Out[14]:
0    0
1    0
2    0
3    0
4    1
5    1
6    1
7    2
dtype: int32
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41873335

复制
相关文章

相似问题

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