首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用熊猫对数据进行排序--根据其他列中的值对第一列进行排序

使用熊猫对数据进行排序--根据其他列中的值对第一列进行排序
EN

Stack Overflow用户
提问于 2018-02-18 01:09:49
回答 2查看 1.1K关注 0票数 1

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

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

  • 首先,将列#1按递增顺序排序。
  • 现在,在每一列#1中,根据#3列中相同的键对数据进行分组(排序顺序不重要)。
  • 现在,只根据col#3中每个组的最小值对列#2进行排序。 For eg:
代码语言:javascript
复制
- for group-4 (in col#3) the smallest value in col2 is 15882592 which is << group-5 (in col#3) smallest value 15883889; So group-4 should be on top of group-5.
- Similarly, for group-5 (in col3) smallest value is in col2 15883889 <<  group-1 (in col3) smallest value 15885010; So group-5 should be on top of group-1.

因此,最后我必须先对col#1进行分组,然后在col#3上对column#2条件(分组)进行分组。

输入数据:

代码语言:javascript
复制
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

预期输出:

代码语言:javascript
复制
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

谢谢,

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-18 03:42:27

我使用transform min作为新密钥

代码语言:javascript
复制
df.assign(New=df.groupby(['col1','col3']).col2.transform('min')).sort_values(['col1','New'])
票数 1
EN

Stack Overflow用户

发布于 2018-02-18 02:21:02

这里有一条路。

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48847508

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档