将下划线排序在大写字母之前

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

我有一个

DataFrame
,其中包含来自我想要排序的数据库中的
UPPERCASE
列名称。其中一些带有下划线前缀
_
。默认排序将它们放在最后。我是否必须将它们转换为小写,然后排序,然后将它们转换回大写,或者有更简单的方法吗?

这是一些示例数据。当

cl2
的值是小写时,顺序是正确。大写的话没那么多。

pd.DataFrame({
   "cl1": ["foo", "foo", "foo"], 
   "cl2": ["_FOO", "BAR", "BAZ"]}
).sort_values(["cl1", "cl2"])
python python-3.x pandas dataframe sorting
2个回答
1
投票

如果转换为小写字母适合您,您可以将其用作键:

pd.DataFrame({
   "cl1": ["foo", "foo", "foo"], 
   "cl2": ["_FOO", "BAR", "BAZ"]}
).sort_values(["cl1", "cl2"], key=lambda s: s.str.lower())

其他选项,按不带

_
的字符串排序,然后按存在
_
的字符串排序:

(pd.DataFrame({
   "cl1": ["foo", "foo", "foo"], 
   "cl2": ["_FOO", "BAR", "BAZ"]})
   .sort_values(["cl1", "cl2"], key=lambda s: s.str.lstrip('_'))
   .sort_values(["cl1", "cl2"], key=lambda s: ~s.str.startswith('_'), kind='stable')
)

输出:

   cl1   cl2
0  foo  _FOO
1  foo   BAR
2  foo   BAZ

0
投票

我也有类似的奇怪结果.. 我最终使用替换来删除排序本身中的下划线,如下所示:

  dl = sorted(dl, key=lambda t: (t[0].replace('_',''),t[1]))

否则我会得到奇怪的结果,例如:

  • 蓝宝石

之前:

  • SAG_AG

Python 排序的工作原理很奇怪。

我尝试了这里这里的两个结果来得出这个结果。

© www.soinside.com 2019 - 2024. All rights reserved.