如何从2列中提取数值范围并将这两列中的范围打印为元组?

时间:2016-11-06 07:54:29

标签: python r pandas numpy awk

我对bash脚本和python编程都很陌生;目前有2列包含数字序列如下:

Col 1:
1
2
3
5
7
8

Col 2:

101
102
103
105
107
108

需要从两列中提取数值范围并根据这两列中的任何一列上的序列中断出现打印它们,结果应如下所示:

1,3,101,103

5,5,105,105

7,8,107,108

已经收到有关如何使用awk从一列中提取数值范围的有用信息: - $ awk' NR == 1 || sqrt(($ 0-p)*($ 0-p)) > 1 {print p; printf"%s",$ 0","} {p = $ 0} END {print $ 0}'档案 - ;但现在问题变得有点复杂了,因为必须包含另一个数字序列的第二列,并且因此需要在列中任何一列上出现序列中断的列的范围。

为了增加一点复杂性,序列可以是升序和/或降序。

尝试使用pandas(数据框)和python的numpy库找到解决方案。

感谢您的进步。

您好MaxU感谢您的回复,不幸的是我遇到了以下情况的问题:

Col 1:

 7
 8
 9
10
11


Col 2:

52
51
47
46
45

第二列中的数字序列从开始下降;它会产生结果:

7,11,45,52

而不是:

7,8,51,52

8,11,45,47

干杯。

1 个答案:

答案 0 :(得分:2)

<强>更新

In [103]: df
Out[103]:
   Col1  Col2
0     7    52
1     8    51
2     9    47
3    10    46
4    11    45

In [104]: (df.groupby((df.diff().abs() != 1).any(1).cumsum()).agg(['min','max']))
Out[104]:
  Col1     Col2
   min max  min max
1    7   8   51  52
2    9  11   45  47

OLD回答:

这是在熊猫中做到这一点的一种方式(其中很多):

数据:

In [314]: df
Out[314]:
   Col1  Col2
0     1   101
1     2   102
2     3   103
3     5   105
4     8   108
5     7   107
6     6   106
7     9   109

注意:注意 - 带索引的行(4,5,6)是递减序列

<强>解决方案:

In [350]: rslt = (df.groupby((df.diff().abs() != 1).all(1).cumsum())
     ...:           .agg(['min','max']))
     ...:

In [351]: rslt
Out[351]:
  Col1     Col2
   min max  min  max
1    1   3  101  103
2    5   5  105  105
3    6   8  106  108
4    9   9  109  109

现在您可以轻松将其保存为CSV文件:

rslt.to_csv(r'/path/to/file_name.csv', index=False, header=None)

或只打印它:

In [333]: print(rslt.to_csv(index=False, header=None))
1,3,101,103
5,5,105,105
6,8,106,108
9,9,109,109