Sorting 熊猫用大写字母排序

Sorting 熊猫用大写字母排序,sorting,pandas,Sorting,Pandas,运行此代码: 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之前,发生了什么事?我不认为这是一个错误。这似乎正是python排序算法处理混合大小写字母的方式(区分大小写)—— 因为当你这样做的时候

运行此代码:

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之前,发生了什么事?

我不认为这是一个错误。这似乎正是python排序算法处理混合大小写字母的方式(区分大小写)——

因为当你这样做的时候:

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
注意:如果要按字母顺序对列进行排序,则必须将
升序
参数设置为
True

编辑:

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

df = df.loc[df["Test"].str.lower().order().index]
更新:

正如所指出的,对于熊猫的较新版本,正确的方法是
。sort\u values()
。因此,上述一个衬里变成:

df = df.loc[df["Test"].str.lower().sort_values().index]

下面是一个如何使用
reindex
对多个列进行排序的示例,它是从@Zero的答案扩展而来的。我们希望首先按照第二列(
sort\u INDEX1
)对示例数据帧进行排序,然后是第一列(
sort\u INDEX2
)。此示例使用不区分大小写的排序对次列(
SORT\u INDEX2
)进行排序,然后使用默认区分大小写的排序对主列(
SORT\u 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
()


编辑:抱歉,第二种排序对于较大的数据集无法正常工作。次列的顺序不保留。这种方法可以按一列进行排序,但我仍然需要找到一种可靠而简洁的方法来对两列进行排序。

使用
数据帧。使用
键对值进行排序
,因为
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

对我来说,这看起来像一个bug,我可以在pandas 0.16.0、numpy 1.9.1 python 3.4.3 64位上重现这个bug,确认老pandas的bug
0.14.0
是的,这是python行为。或者,您可以执行类似于
df.loc[df[“Test”].str.lower().order().index]
的操作,以避免创建临时列。OP仍然需要决定“AbC”和“AbC”之间的相对顺序。我从来都不知道这一点,这是很有见地的+1上述一行程序不再适用于较新版本的熊猫,因为
Series.order()
现在是
Series.sort\u values()
。因此,这将转换为
df.loc[df[“Test”].str.lower().sort_values().index]
df.sort_values(by="Test", key=lambda x: x.str.lower())

  Test
1  Abc
0  ADc
2  AEc