我非常熟悉了学习python和pandas(这个问题基于一个明显的帖子,但有一个额外的查询);目前有2列包含数字序列(升序和/或降序),如下所述:
Col 1 :( col1数字增量和/或减量= 1)
1
2
3
5
7
8
9
第2栏:( Col2数字增量和/或减量= 4)
113
109
105
90
94
98
102
需要从两列中提取数值范围并根据这两列中任何一列的序列中断出现打印它们,结果应如下所示:
1,3,105,113
5,5,90,90
7,9,94,102
已经收到了一个非常有用的方法来使用@MaxU的python的pandas库,它使用col1和col2 =增加和/或减少1的标准,根据在两列上检测到的中断生成数值范围。 / p>
How can I extract numeric ranges from 2 columns and print the range from both columns as tuples?
这种情况的唯一区别在于,对于每一列,应用于两列的递增/递减标准是不同的。
答案 0 :(得分:3)
试试这个:
In [42]: df
Out[42]:
Col1 Col2
0 1 113
1 2 109
2 3 105
3 5 90
4 7 94
5 8 98
6 9 102
In [43]: df.groupby(df.diff().abs().ne([1,4]).any(1).cumsum()).agg(['min','max'])
Out[43]:
Col1 Col2
min max min max
1 1 3 105 113
2 5 5 90 90
3 7 9 94 102
解释:我们的目标是对[1,4]
,Col1
的增量/减量Col2
进行相应的分组:
In [44]: df.diff().abs()
Out[44]:
Col1 Col2
0 NaN NaN
1 1.0 4.0
2 1.0 4.0
3 2.0 15.0
4 2.0 4.0
5 1.0 4.0
6 1.0 4.0
In [45]: df.diff().abs().ne([1,4])
Out[45]:
Col1 Col2
0 True True
1 False False
2 False False
3 True True
4 True False
5 False False
6 False False
In [46]: df.diff().abs().ne([1,4]).any(1)
Out[46]:
0 True
1 False
2 False
3 True
4 True
5 False
6 False
dtype: bool
In [47]: df.diff().abs().ne([1,4]).any(1).cumsum()
Out[47]:
0 1
1 1
2 1
3 2
4 3
5 3
6 3
dtype: int32