Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从两列中提取数字范围并将两列中的范围打印为元组?_Python_R_Pandas_Numpy_Awk - Fatal编程技术网

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

Python 如何从两列中提取数字范围并将两列中的范围打印为元组?,python,r,pandas,numpy,awk,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 需要从这两列中提取数字范围,并根据这两列中任意一列的顺序中断间隔打印,结果如下: Col 1: 1 2 3 5 7 8 Col 2: 101 102 103 105 107 108 1,3,101,103 5,5,105,

我对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
需要从这两列中提取数字范围,并根据这两列中任意一列的顺序中断间隔打印,结果如下:

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(数据帧)和numpython库找到解决方案

提前谢谢你

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

第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


干杯。

更新:

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
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
旧答案:

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
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
在熊猫身上,有一种方法可以做到这一点:

数据:

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 [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
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

为什么使用R标记??这在R中使用
rle
diff
是相当可行的。我想你必须解释一下这个序列是如何工作的。Hello@MaxU谢谢你的回复不幸的是,我遇到了以下情况的问题:7 52 8 51 9 47 10 4611.45其中第二列中的数字顺序从开头开始递减;其结果是:7,11,45,52@A.ALT,你能在你的问题中提供你的数据集吗,因为它在评论中几乎不可读?它符合目前的需要;清楚,切中要害,快速回答,Cheers AALTHello@MaxU,是否有办法运行相同的程序,但对于一列中的序列增加/减少1,第二列中的序列增加/减少2的情况?;干杯-这个案例刚刚出现,在pandas文档中发现,可以使用groupped选项进行操作,但无法进行分类。@A.ALT,请您用一个小样本数据集和所需(预期)数据集来回答一个新问题好吗?