运行此代码:
df = pd.DataFrame(['ADc','Abc','AEc'],columns = ['Test'],index=[0,1,2])
df.sort(columns=['Test'],axis=0, ascending=False,inplace=True)
返回按以下顺序排列的数据框列:[Abc, AEc, ADc]
。
ADc应该在AEc之前,发生了什么?
答案 0 :(得分:6)
我认为这不是熊猫的错误。它似乎只是python排序算法与混合套装字母一起工作的方式(区分大小写) - look here
因为当你这样做时:
In [1]: l1 = ['ADc','Abc','AEc']
In [2]: l1.sort(reverse=True)
In [3]: l1
Out[3]: ['Abc', 'AEc', 'ADc']
因此,由于显然无法使用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
注意:如果您希望按字母顺序对列进行排序,则ascending
参数必须设置为True
修改强>
正如DSM建议的那样,为避免创建新的帮助列,您可以执行以下操作:
df = df.loc[df["Test"].str.lower().order().index]
<强>更新强>
正如weatherfrog所指出的,对于较新版本的pandas,正确的方法是.sort_values()
。所以上面的单行成为:
df = df.loc[df["Test"].str.lower().sort_values().index]
答案 1 :(得分:1)
自DataFrame.sort_values
起将 key
与 pandas >= 1.1.0
参数一起使用:
我们现在可以在sort_values方法中使用字符串的自定义函数或任何其他自定义键:
df = pd.DataFrame(['ADc','Abc','AEc'],columns = ['Test'],index=[0,1,2])
print(df)
Test
0 ADc
1 Abc
2 AEc
df.sort_values(by="Test", key=lambda x: x.str.lower())
Test
1 Abc
0 ADc
2 AEc
答案 2 :(得分:0)
以下是如何使用reindex
对多个列进行排序的示例,该列从@ Zero的答案here扩展而来。我们希望首先按第二列(SORT_INDEX1
)排序示例数据帧,然后是第一列(SORT_INDEX2
)。此示例使用不区分大小写的排序对辅助列(SORT_INDEX2
)进行排序,然后使用默认区分大小写的排序对主列(SORT_INDEX1
)进行排序。
import pandas as pd
df = pd.DataFrame([['q', '1'],['a', '1'],['B', '1'],['C', '1'],
['q', '0'],['a', '0'],['B', '0'],['C', '0']])
SORT_INDEX1 = 1
SORT_INDEX2 = 0
# Cannot change sorting algorithm used internally by pandas.
df_default = df.sort_values(by=[SORT_INDEX1, SORT_INDEX2])
# Use tuple of (index, value to sort by) to get a list of sorted indices, obtained through unzipping.
df_new = df.reindex(list(zip(*sorted(zip(df.index, df[SORT_INDEX2]), key=lambda t: t[1].lower())))[0])
.sort_values(by=SORT_INDEX1)
print('Original dataframe:')
print(df)
print('Default case-sensitive sort:')
print(df_default)
print('Case-insensitive sort:')
print(df_new)
输出:
Original dataframe:
0 1
0 q 1
1 a 1
2 B 1
3 C 1
4 q 0
5 a 0
6 B 0
7 C 0
Default case-sensitive sort:
0 1
6 B 0
7 C 0
5 a 0
4 q 0
2 B 1
3 C 1
1 a 1
0 q 1
Case-insensitive sort:
0 1
5 a 0
6 B 0
7 C 0
4 q 0
1 a 1
2 B 1
3 C 1
0 q 1
编辑:道歉,第二种排序不适用于较大的数据集。不保留辅助列的顺序。这个方法适用于按一列排序,但我仍然需要找到一种可靠而简洁的方法来排序2列。