给定该列中已排序的值列表,如何对该列上的 pandas DataFrame 进行排序?

Pet*_*ter 2 python sorting dataframe pandas

我有一个如下所示的 pandas DataFrame:

df = pd.DataFrame({["id": [1, 2, 3, 4, 5],
                    "fruit": ["apple", "banana", "pineapple", "orange", "orange"],
                    "trash": [38, 22, 93, 1, 15]})
Run Code Online (Sandbox Code Playgroud)

fruit现在我想根据提供的有序列表对该 DataFrame 的行在 column 上进行排序。可以说这个列表是:

ordered_list = ["pinapple", "banana", "orange", "apple"]
Run Code Online (Sandbox Code Playgroud)

我想产生以下输出(我不关心具有相同水果值的行的顺序,因此行orange可能会颠倒):

id        fruit        trash
3         pineapple    93
2         banana       22
4         orange       1
5         orange       15
1         apple        38
Run Code Online (Sandbox Code Playgroud)

怎么解决这个问题呢?我知道我可以使用一些 for 循环,但如果没有更优雅的解决方案(我无法找到),我会感到惊讶。该解决方案应该尽可能节省时间,因为真正的 DataFrame 由大约 5000 行组成(大约有 50 个唯一fruit值)

Shu*_*rma 7

方法一

将列转换Fruit为有序分类类型并对值进行排序

df['fruit'] = pd.Categorical(df['fruit'], ordered_list, ordered=True)
df.sort_values('fruit')
Run Code Online (Sandbox Code Playgroud)

方法2

通过传递一个键函数对值进行排序,该函数将水果名称映射到相应的顺序

df.sort_values('fruit', key=lambda x: x.map({v:k for k, v in enumerate(ordered_list)}))
Run Code Online (Sandbox Code Playgroud)
   id      fruit  trash
2   3  pineapple     93
1   2     banana     22
3   4     orange      1
4   5     orange     15
0   1      apple     38
Run Code Online (Sandbox Code Playgroud)