使用python的PANDAS数据框并基于前一个问题(How to extract numeric ranges from 2 columns containig numeric sequences and print the range from both columns (different increment values)?);得到了以下问题:有没有办法使用pandas数据框根据每列的不同数学运算创建数值范围?
e.g:
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
标准:创建数字范围,其中序列(升序或降序)由任何值&gt; 2
进行整理标准:创建数值范围,其中数字序列(升序或降序)由任何值&lt; = 3
进行整理预期结果应该是序列根据上面显示的标准中断的范围:
col1_from col1_to col2_from col2_to
1 6 23 35
9 13 40 49
15 15 51 51
答案 0 :(得分:2)
数据:强>
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
<强>解决方案:强>
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
<强>解释强>
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