大熊猫用大写字母排序

tpo*_*poh 4 sorting pandas

运行此代码:

df = pd.DataFrame(['ADc','Abc','AEc'],columns = ['Test'],index=[0,1,2])
df.sort(columns=['Test'],axis=0, ascending=False,inplace=True)
Run Code Online (Sandbox Code Playgroud)

返回有序的数据帧列:[Abc, AEc, ADc].ADc应该在AEc之前,发生了什么?

pau*_*ip3 8

我不认为这是一个熊猫的错误​​.它似乎只是python排序算法使用混合套装字母的方式(区分大小写) - 看这里

因为当你这样做时:

In [1]: l1 = ['ADc','Abc','AEc']
In [2]: l1.sort(reverse=True)
In [3]: l1
Out[3]: ['Abc', 'AEc', 'ADc']
Run Code Online (Sandbox Code Playgroud)

因此,由于显然无法使用pandas排序方法控制排序算法,因此只需使用该列的较低版本的版本进行排序,然后将其删除:

In [4]: df = pd.DataFrame(['ADc','Abc','AEc'],columns = ['Test'],index=[0,1,2])
In [5]: df['test'] = df['Test'].str.lower()
In [6]: df.sort(columns=['test'], axis=0, ascending=True, inplace=True)
In [7]: df.drop('test', axis=1, inplace=True)
In [8]: df
Out[8]:
  Test
1  Abc
0  ADc
2  AEc
Run Code Online (Sandbox Code Playgroud)

注意:如果希望按字母顺序排序列,则ascending必须将参数设置为True

编辑:

正如DSM建议的那样,为避免创建新的帮助列,您可以执行以下操作:

df = df.loc[df["Test"].str.lower().order().index]
Run Code Online (Sandbox Code Playgroud)

更新:

正如weatherfrog所指出的,对于新版本的熊猫,正确的方法是.sort_values().所以上面的单行成为:

df = df.loc[df["Test"].str.lower().sort_values().index]
Run Code Online (Sandbox Code Playgroud)

  • 是的,这是Python的行为.或者,您可以执行类似`df.loc [df ["Test"].str.lower().order().index]`的操作,以避免创建临时列.OP仍然必须决定如何相对于彼此订购"AbC"和"ABc". (2认同)