我对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
干杯。
答案 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