熊猫:根据一些可能值的规则对多列进行排序

时间:2018-07-10 21:52:49

标签: python pandas

我有一个如下数据框:

import pandas as pd
df = pd.DataFrame([ ['X', 1],
                    ['a', 3],        
                    ['b', 4],
                    ['Y', 1],
                    ['Y', 4] ],
                    columns=['col1', 'col2' ]
                   )

df
  col1 col2
0    X   1
1    a   3
2    b   4
3    Y   1
4    Y   4

我想创建一个排序规则,该规则首先按col2进行排序,然后基于一个规则按col1进行排序,以使X排在最前面,然后是Y,其余的可以按字母顺序排列。没有一个值保证在数据框中,但是如果是,我想按所述进行排序。所需的结果将是:

df
  col1 col3
0    X   1
1    Y   1
2    a   3
3    Y   4
4    b   4

如果我知道列中的所有值,就可以按特殊顺序排序,如下所示:

df.col1=pd.Categorical(df.col1,['X','Y','a', 'b'])
df.sort_values(['col2','col1'])

但是我不知道col1中会出现什么值。是否正在考虑使用col1值在python中创建一个列表,并使用某种逻辑对该列表进行排序,然后将该排序后的列表传递给Categorical,但我想知道是否有更清洁的方法也许仅使用了熊猫?

谢谢。

2 个答案:

答案 0 :(得分:1)

您可以创建一个帮助键

df['helpkey']=np.where(df.col1.isin(['X','Y']),0,1)
df.sort_values(['col2','helpkey','col1'])
Out[410]: 
  col1  col2  helpkey
0    X     1        0
3    Y     1        0
1    a     3        1
4    Y     4        0
2    b     4        1

然后,您可以使用drop('helperkey',1)删除帮助器列

答案 1 :(得分:0)

您也可以使用pd.Categorical

o = ["X", "Y"]
df['col1'] = pd.Categorical(df['col1'], o + df.col1[~df.col1.isin(o)].tolist())

然后就

df.sort_values(by=['col2', 'col1'])

    col1    col2
0   X       1
3   Y       1
1   a       3
4   Y       4
2   b       4

另一种方法是将类别分配给一个col3,然后将其删除(如果要保持col1不变)