Pandas中的sort_values()的行为与文档相反

时间:2018-12-24 08:59:37

标签: python pandas sorting

我对Pandas中sort_values()的行为感到困惑,该行为似乎无法正确地响应axis参数。

举个玩具例子:

toy.to_json()
'{"labels":{"0":7,"1":4,"2":7,"3":1,"4":5,"5":0,"6":3,"7":1,"8":4,"9":9},"companies":{"0":"Apple","1":"AIG","2":"Amazon","3":"American express","4":"Boeing","5":"Bank of America","6":"British American Tobacco","7":"Canon","8":"Caterpillar","9":"Colgate-Palmolive"}}'

toy.sort_values('labels') # this works alright
labels  companies
5   0   Bank of America
3   1   American express
7   1   Canon
6   3   British American Tobacco
1   4   AIG
8   4   Caterpillar
4   5   Boeing
0   7   Apple
2   7   Amazon
9   9   Colgate-Palmolive

toy.sort_values(by = 'labels', axis = 1) # Returns an exception
KeyError: 'labels'

3 个答案:

答案 0 :(得分:1)

这是因为在示例中,轴0为“向下”,而轴1为“向右”(即跨列) 如果查看sort_values的文档,就会看到第一个参数确实是by,而axis的默认值是0。 因此,重复您的第一个示例,您需要执行toy.sort_values(by='labels', axis=0)

答案 1 :(得分:0)

为上述评论和答案添加示例:

假设您具有以下数据框:

df = pd.DataFrame(data={"labels":{"0":7,"1":4,"2":7,"3":1,"4":5},"companies":{"0":9,"1":1,"2":6,"3":1,"4":8}})
>>df
    labels  companies
0   7       9
1   4       1
2   7       6
3   1       1
4   5       8

对于axis=0,当您通过以下方式传递索引级别和/或列标签时,它将进行排序:

df.sort_values(by='labels')

为您提供了经过排序的label列(默认情况下升序)。

   labels   companies
3   1       1
1   4       1
4   5       8
0   7       9
2   7       6

来到axis=1,请参考以下代码:

df.sort_values('4',axis=1)

这将以对index 4进行排序的方式对列进行排序。由于index 4小于5,因此8不会更改任何内容,默认情况下排序为ascending。但是,如果执行df.sort_values('1',axis=1)下的值大于label的{​​{1}},则会看到companieslabels的位置已交换。 / p>

companies

希望这可以澄清。

答案 2 :(得分:0)

当我们选择axis=1axis=0时,只是为了理解轴和行即可。

df.shape[0]  # gives number of row count
df.shape[1]  # gives number of col count

让我们假设一个dataFrame如下:

>>> df = pd.DataFrame({
...     'col1' : ['A', 'A', 'B', np.nan, 'D', 'C'],
...     'col2' : [2, 1, 9, 8, 7, 4],
...     'col3': [0, 1, 9, 4, 2, 3],
... })

>>> df
  col1  col2  col3
0    A     2     0
1    A     1     1
2    B     9     9
3  NaN     8     4
4    D     7     2
5    C     4     3

因此,应用df.shape并查看它如何绕过列和行:

>>> df.shape[0]
6            <-- Here, we have six row into the dataFrame
>>> df.shape[1]
3            <-- Here, we have three columns into the dataFrame

现在,如果您只是按列名对值进行排序,那么由于已经指定了列名,因此无需指定axis=1,只需执行以下操作即可:

>>> df.sort_values(by=['col1'])
  col1  col2  col3
0    A     2     0
1    A     1     1
2    B     9     9
5    C     4     3
4    D     7     2
3  NaN     8     4

或者,您可以使用by将多个列名作为列表传递:

>>> df.sort_values(by=['col1', 'col2'])
  col1  col2  col3
1    A     1     1
0    A     2     0
2    B     9     9
5    C     4     3
4    D     7     2
3  NaN     8     4