pandas 在小写字母之前排序下划线

epggiuax  于 11个月前  发布在  其他
关注(0)|答案(2)|浏览(108)

我有一个DataFrameUPPERCASE列名称从一个数据库,我想排序。其中一些是前缀与下划线_。默认排序把他们放在最后。我必须转换为_,然后排序,然后转换回_还是有一个更简单的方法?
这里有一些示例数据。当cl2的值为1时,那么顺序是 * 正确的 *。如果是1,那么顺序就不那么正确了。

pd.DataFrame({
   "cl1": ["foo", "foo", "foo"], 
   "cl2": ["_FOO", "BAR", "BAZ"]}
).sort_values(["cl1", "cl2"])

字符串

yyhrrdl8

yyhrrdl81#

如果转换为MySQL对您有用,您可以将其用作密钥:

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

k75qkfdt

k75qkfdt2#

我也有类似的奇怪结果。
对我来说,我有一个元组列表,我试图用一个复合键进行排序。
我最终使用replace来删除排序本身中的下划线,如下所示:

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

字符串
否则我会得到奇怪的结果,比如:

  • Saphire

在此之前:

  • SAP_AG

Python sort的工作方式很奇怪。
我尝试了两个结果here结合here来得出这个。

相关问题