Pandas sort_values 无法正确排序数字

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

我已经按特定列对数据框进行了排序,但 pandas 吐出的答案并不完全正确。

这是我使用的代码:

league_dataframe.sort_values('overall_league_position')

排序方法在“整体联赛位置”列中生成值的结果未按升序排序,这是该方法的默认顺序。

我做错了什么?

python pandas sorting dataframe
2个回答
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

补救方法是使用

.astype
pd.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
),并且如果强制浮动是则尝试保留整数没有必要(如本例所示)。


0
投票

如果列的数据类型应该是数字,那么在排序之前转换为数字数据类型是正确的方法。但是,如果您想保留字符串/对象数据类型但仍要自然排序,则可以将

pd.to_numeric
作为
sort_values()
的键传递。

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

这类似于普通 Python 中的

sorted(mylist, key=float)
,其中实际数据的类型没有修改,但键的类型发生了变化。但是,与
sorted()
不同,作为键传递给
sort_values()
的函数必须进行矢量化(例如,它必须返回整列排序键);所以
float
不能工作,但
pd.to_numeric
可以。

一个更具说明性的示例是对百分比列进行自然排序。在这种情况下,我们可以传递一个 lambda 函数,该函数去除百分比符号并将该列转换为数字列作为排序键。

df = pd.DataFrame({"Col": ['1%', '10%', '3%', '2%', '20%', '19%']})
df = df.sort_values('Col', key=lambda x: pd.to_numeric(x.str.rstrip('%'), errors='coerce'))
# if the data is clean, can use `astype` as well
df = df.sort_values('Col', key=lambda x: x.str.rstrip('%').astype(float))

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