如何按多列自定义排序数据框

问题描述 投票:0回答:1

我有一个数据框代表未分类的 MTG 卡的集合。如果有人熟悉 MTG,我正在尝试以与集合排序相同的方式对集合进行排序:

  1. 颜色:W、U、B、R、G、五彩、无色
  2. 在每种颜色中按字母顺序按卡片名称排序
  3. 地类型的牌应该总是排在最后并按字母顺序排序。它们也是无色的

我想出了如何使用自定义函数按颜色排序,但我正在努力进行排序。这是我所拥有的:

def get_color_order(color):
    color_order = {
        "['W']": 1,
        "['U']": 2,
        "['B']": 3,
        "['R']": 4,
        "['G']": 5,
        "[]": 7,
    }
    return color_order.get(color, 6)

def get_type_order(card_type):
    if card_type.contains("Land"):
        return 1
    else:
        return 0

filtered_df = filtered_df.sort_values(
    by=["Colors", "Name", "Type"],
    key=[lambda x: x.apply(get_color_order), filtered_df["Name"], lambda y: y.apply(get_type_order)],
)
python pandas dataframe sorting
1个回答
0
投票

这里有一个方法:

def get_color_order(color):
    color_order = {
        "['W']": 1,
        "['U']": 2,
        "['B']": 3,
        "['R']": 4,
        "['G']": 5,
        "[]": 7,
    }
    return color_order.get(color, 6)

def get_type_order(card_type):
    if card_type == "Land":
        return 1
    else:
        return 0

filtered_df = ( filtered_df
    .assign(key_Colors=filtered_df.Colors.apply(get_color_order))
    .assign(key_Name=filtered_df.Name)
    .assign(key_Type=filtered_df.Type.apply(get_type_order))
    .set_index(["key_Type", "key_Colors", "key_Name"])
    .sort_index()
    .reset_index(drop=True) )
print(filtered_df)

样本输入:

           Colors Name   Type
0              []  Zeb   Land
1              []  Ann   Land
2              []  May  Other
3           ['G']  Zeb  Other
4           ['U']  Ann  Other
5           ['B']  May  Other
6           ['R']  Zeb  Other
7           ['W']  Ann  Other
8           ['G']  May  Other
9           ['U']  Zeb  Other
10          ['B']  Ann  Other
11          ['R']  May  Other
12          ['W']  Zeb  Other
13          ['G']  Ann  Other
14          ['U']  May  Other
15          ['B']  Joe  Other
16          ['R']  Jan  Other
17          ['W']  Jeb  Other
18  ['B','U','G']  Jen  Other
19      ['R','W']  Jed  Other

输出:

           Colors Name   Type
0           ['W']  Ann  Other
1           ['W']  Jeb  Other
2           ['W']  Zeb  Other
3           ['U']  Ann  Other
4           ['U']  May  Other
5           ['U']  Zeb  Other
6           ['B']  Ann  Other
7           ['B']  Joe  Other
8           ['B']  May  Other
9           ['R']  Jan  Other
10          ['R']  May  Other
11          ['R']  Zeb  Other
12          ['G']  Ann  Other
13          ['G']  May  Other
14          ['G']  Zeb  Other
15      ['R','W']  Jed  Other
16  ['B','U','G']  Jen  Other
17             []  May  Other
18             []  Ann   Land
19             []  Zeb   Land
© www.soinside.com 2019 - 2024. All rights reserved.