我已经按特定列对数据框进行了排序,但 pandas 吐出的答案并不完全正确。
这是我使用的代码:
league_dataframe.sort_values('overall_league_position')
排序方法在“整体联赛位置”列中生成值的结果未按升序排序,这是该方法的默认顺序。
我做错了什么?
无论出于何种原因,您似乎正在使用一列字符串,并且
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
),并且如果强制浮动是则尝试保留整数没有必要(如本例所示)。
如果列的数据类型应该是数字,那么在排序之前转换为数字数据类型是正确的方法。但是,如果您想保留字符串/对象数据类型但仍要自然排序,则可以将
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))