Pandas DataFrame 按分类列排序,但按特定类排序

新手上路,请多包涵

我想使用 df_selected = df_targets.head(N) 根据特定列的条目选择 Pandas 数据框中的顶部条目。

每个条目都有一个 target 值(按重要性排序):

 Likely Supporter, GOTV, Persuasion, Persuasion+GOTV

不幸的是,如果我这样做

df_targets = df_targets.sort("target")

排序将按字母顺序排列( GOTVLikely Supporter ,…)。

我希望有一个像 list_ordering 这样的关键字,如下所示:

 my_list = ["Likely Supporter", "GOTV", "Persuasion", "Persuasion+GOTV"]
df_targets = df_targets.sort("target", list_ordering=my_list)

为了处理这个问题,我创建了一个字典:

 dict_targets = OrderedDict()
dict_targets["Likely Supporter"] = "0 Likely Supporter"
dict_targets["GOTV"] = "1 GOTV"
dict_targets["Persuasion"] = "2 Persuasion"
dict_targets["Persuasion+GOTV"] = "3 Persuasion+GOTV"

,但这似乎是一种非 pythonic 方法。

建议将不胜感激!

原文由 elzurdo 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 412
1 个回答

我认为你需要 Categorical 参数 ordered=True 然后按 sort_values 排序,效果很好:

检查文档 Categorical

Ordered Categoricals 可以根据类别的自定义顺序进行排序,并且可以具有最小值和最大值。

 import pandas as pd

df = pd.DataFrame({'a': ['GOTV', 'Persuasion', 'Likely Supporter',
                         'GOTV', 'Persuasion', 'Persuasion+GOTV']})

df.a = pd.Categorical(df.a,
                      categories=["Likely Supporter","GOTV","Persuasion","Persuasion+GOTV"],
                      ordered=True)

print (df)
                  a
0              GOTV
1        Persuasion
2  Likely Supporter
3              GOTV
4        Persuasion
5   Persuasion+GOTV

print (df.a)
0                GOTV
1          Persuasion
2    Likely Supporter
3                GOTV
4          Persuasion
5     Persuasion+GOTV
Name: a, dtype: category
Categories (4, object): [Likely Supporter < GOTV < Persuasion < Persuasion+GOTV]
 df.sort_values('a', inplace=True)
print (df)
                  a
2  Likely Supporter
0              GOTV
3              GOTV
1        Persuasion
4        Persuasion
5   Persuasion+GOTV

原文由 jezrael 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题