Pandas sort_values不能正确排序数字

21

我对Pandas和在编程环境中处理表格数据很新。我已经按照特定列排序了一个数据框,但是Pandas返回的结果并不完全正确。

这是我使用的代码:

league_dataframe.sort_values('overall_league_position')

排序方法在'总体联赛排名'列中生成的结果未按升序或方法的默认顺序排序。

enter image description here

我做错了什么?感谢您的耐心!


1
请直接将代码粘贴到问题中,而不是作为图片。您可以使用 {} 按钮正确格式化代码。输出结果也应该这样做。 - Craig
2
这是一个字符串列,所以才这样。 - cs95
1个回答

34

出于某种原因,您似乎正在使用一个字符串列,并且sort_values返回了一个字典序排列的结果。

以下是一个示例。

df = pd.DataFrame({"Col": ['1', '2', '3', '10', '20', '19']})
df

  Col
0   1
1   2
2   3
3  10
4  20
5  19

df.sort_values('Col')

  Col
0   1
3  10
5  19
1   2
4  20
2   3

解决方法是将其转换为数字,可以使用.astypepd.to_numeric函数。

df.Col = df.Col.astype(float)

或者,

df.Col = pd.to_numeric(df.Col, errors='coerce')
df.sort_values('Col')

   Col
0    1
1    2
2    3
3   10
5   19
4   20

astype和pd.to_numeric之间唯一的区别是后者更能够处理非数字字符串(它们被强制转换为NaN),并且会尝试在不需要将整数强制转换为浮点数时保留整数(就像在这种情况下看到的那样)。


2
如果我需要实际处理字符串值并保持它们的原样,怎么办?例如字符串 "1%"、"2%"、"10%"、"25%"等等?有没有一种方法可以通过自定义比较器对这些值进行排序,而不必来回转换数据? - Adam Bajger
@AdamBajger 你可以在网上查找“pandas自然排序列”。 - cs95
@cs95,我刚在这里找到了一个全面的答案(https://dev59.com/q2Yr5IYBdhLWcg3wOX66#54301218),虽然感谢natsorted,它也有所帮助。 - Adam Bajger
@AdamBajger 哦,太棒了,我想我认识那个拥有那个答案的人... - cs95
救了我的一天,老兄!.astype(float) 起作用了。 - Davidson Lima

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接