使用pandas对数据进行排序 - 按照其他列中的值对第一列进行排序

时间:2018-02-18 01:09:50

标签: python python-3.x pandas sorting

我尝试使用awk, sort, sed获取以下输入数据。我觉得使用那些unix实用程序处理它们可能太复杂了。可能pandas可能是好的。

这些是对数据进行排序的条件。

  • 首先按升序排列#1列。
  • 现在,在每列#1中,基于第3列中相同的键(排序顺序并不重要)对数据进行分组。
  • 现在,仅根据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

谢谢,

2 个答案:

答案 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'])