根据特定顺序对熊猫数据框进行排序

时间:2020-03-05 23:24:13

标签: python pandas sorting merge

给定数据:

df = pd.DataFrame(dict(
    a = ['cup', 'plate', 'apple', 'seal'],
    b = ['s','sf', 'wer', 'sdfg']
))

哪个是:

       a     b
0    cup     s
1  plate    sf
2  apple   wer
3   seal  sdfg

如何订购

apple
seal
cup
plate

一种可行的方法,但似乎有些过分了:

ordering = pd.DataFrame(dict(
    a = [ "apple", "seal", "cup", "plate" ],
    c = [0,1,2,3]
))
pd.merge(df, ordering, left_on="a", right_on="a", how="left").sort_values(["c"]).drop(
    ["c"], axis=1
)

2 个答案:

答案 0 :(得分:3)

IIUC Categorical

df=df.iloc[pd.Categorical(df.a, ['apple','seal','cup','plate']).argsort()]
df
Out[235]: 
       a     b
2  apple   wer
3   seal  sdfg
0    cup     s
1  plate    sf

答案 1 :(得分:2)

您可能想使用a作为索引,然后使用.loc索引技巧:

order = ["apple", "seal", "cup", "plate"]
df.set_index('a').loc[order].reset_index()

那给

       a     b
0  apple   wer
1   seal  sdfg
2    cup     s
3  plate    sf

关于后续问题,如果在原始数据帧的末尾添加一个苹果,则会返回多个苹果:

           b
a
apple    wer
apple  sasda
seal    sdfg
cup        s
plate     sf

索引不必是唯一的。如果索引中有duplicates,则.loc都将返回它们。