【问题标题】:How can I extract numeric ranges from 2 columns and print the range from both columns as tuples?如何从 2 列中提取数字范围并将两列中的范围打印为元组?
【发布时间】:2017-03-19 17:35:14
【问题描述】:

我对 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{打印 p; printf "%s", $0 ", "} {p=$0} END{print $0}' 文件 - ;但是现在问题变得有点复杂了,因为必须包含带有另一个数字序列的第二列,因此需要在任意两列中出现序列中断的列中的范围。

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

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

提前致谢。

您好 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

干杯。

【问题讨论】:

  • 为什么是 R 标签??
  • 这在 R 中使用 rlediff 是相当可行的。
  • 我认为您将不得不解释该序列是如何工作的。

标签: python r pandas numpy awk


【解决方案1】:

更新:

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

旧答案:

这是在 Pandas 中执行此操作的一种方法(在众多方法中):

数据:

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

【讨论】:

  • 您好@MaxU 感谢您的回复,不幸的是,我遇到了以下情况的问题:7 52 8 51 9 47 10 46 11 45 第二列中的数字序列从头开始下降;结果生成:7,11,45,52
  • @A.ALT,你能在你的问题中post你的数据集吗,因为它在评论中难以阅读?
  • 适合当下的需求;清晰、中肯和快速的答案,干杯 AALT
  • 你好@MaxU,有没有办法运行相同的过程,但对于一列中的序列增加/减少1并且第二列中的序列增加/减少2的情况?干杯 - 这个案例刚刚出现,在 pandas 文档中发现可以使用分组选项来完成,但一直无法解决。
  • @A.ALT,能否请您使用小样本数据集和所需(预期)数据集打开一个新问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-03
  • 2020-06-14
  • 2013-12-17
  • 1970-01-01
  • 1970-01-01
  • 2014-07-10
相关资源
最近更新 更多