我有一个如下数据框:
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,但我想知道是否有更清洁的方法也许仅使用了熊猫?
谢谢。
答案 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
不变)