我尝试使用awk, sort, sed
获取以下输入数据。我觉得使用那些unix实用程序处理它们可能太复杂了。可能pandas
可能是好的。
这些是对数据进行排序的条件。
现在,仅根据col#3中每个组的最小值对第2列进行排序。
例如:
对于组-4(在组#3中),col2中的最小值是15882592,其是<<<<第5组(第3组)最小值15883889;所以group-4应该在第5组之上。
类似地,对于组-5(在col3中),最小值在col2 15883889<< group-1(col3中)最小值15885010;所以group-5应该在group-1之上。
所以,最后我必须首先对第1列进行分组,然后将第2列对第3列进行条件(分组)。
输入数据:
2 15881989 6
2 15882091 6
2 15882148 6
2 15882328 6
2 15882364 6
2 15882451 8
2 15882454 8
2 15882493 8
2 15882592 4
2 15882601 4
2 15882607 4
2 15883765 4
2 15883782 4
2 15883783 4
2 15883785 4
2 15883861 4
2 15883862 4
2 15883889 5
2 15883894 5
2 15883904 5
2 15884457 5
2 15884525 5
2 15884546 4
2 15884550 4
2 15884582 4
2 15884613 4
2 15884649 4
2 15884742 4
2 15884965 4
2 15885010 1
2 15885024 1
2 15885061 4
2 15896126 4
3 15896174 4
3 15896152 4
3 15896128 3
3 15896224 3
3 15896258 3
3 15896406 3
预期输出:
2 15881989 6
2 15882091 6
2 15882148 6
2 15882328 6
2 15882364 6
2 15882451 8
2 15882454 8
2 15882493 8
2 15882592 4
2 15882601 4
2 15882607 4
2 15883765 4
2 15883782 4
2 15883783 4
2 15883785 4
2 15883861 4
2 15883862 4
2 15884546 4
2 15884550 4
2 15884582 4
2 15884613 4
2 15884649 4
2 15884742 4
2 15884965 4
2 15885061 4
2 15896126 4
2 15896128 4
2 15896152 4
2 15883889 5
2 15883894 5
2 15883904 5
2 15884457 5
2 15884525 5
2 15885010 1
2 15885024 1
3 15896128 3
3 15896224 3
3 15896258 3
3 15896406 3
3 15896152 4
3 15896174 4
谢谢,
答案 0 :(得分:1)
这是一种方式。
import pandas as pd
# assume df.columns = ['1', '2', '3']
# calculate order
d = {x: df[df['1'] == x].groupby(['3'], as_index=False)['2'].min()\
.sort_values('2')['3'].tolist() for x in set(df['1'])}
# enumerate order and store in dictionary
d = {k: {w: i for i, w in enumerate(v)} for k, v in d.items()}
# apply order by '3' in new column
df['order'] = df.apply(lambda row: d.get(row['1']).get(row['3']), axis=1)
# sort by each column
df = df.sort_values(['1', 'order', '2']).drop('order', 1)
# 1 2 3
# 0 2 15881989 6
# 1 2 15882091 6
# 2 2 15882148 6
# 3 2 15882328 6
# 4 2 15882364 6
# 5 2 15882451 8
# 6 2 15882454 8
# 7 2 15882493 8
# 8 2 15882592 4
# 9 2 15882601 4
# 10 2 15882607 4
# 11 2 15883765 4
# 12 2 15883782 4
# 13 2 15883783 4
# 14 2 15883785 4
# 15 2 15883861 4
# 16 2 15883862 4
# 22 2 15884546 4
# 23 2 15884550 4
# 24 2 15884582 4
# 25 2 15884613 4
# 26 2 15884649 4
# 27 2 15884742 4
# 28 2 15884965 4
# 31 2 15885061 4
# 32 2 15896126 4
# 17 2 15883889 5
# 18 2 15883894 5
# 19 2 15883904 5
# 20 2 15884457 5
# 21 2 15884525 5
# 29 2 15885010 1
# 30 2 15885024 1
# 35 3 15896128 3
# 36 3 15896224 3
# 37 3 15896258 3
# 38 3 15896406 3
# 34 3 15896152 4
# 33 3 15896174 4
答案 1 :(得分:1)
我使用transform
min
作为新密钥
df.assign(New=df.groupby(['col1','col3']).col2.transform('min')).sort_values(['col1','New'])