为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

皈依舞 2021-09-25 13:30:56
我对 Pandas 中 sort_values() 的行为感到困惑,它似乎没有对轴参数做出适当的响应。以玩具为例: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 alrightlabels  companies5   0   Bank of America3   1   American express7   1   Canon6   3   British American Tobacco1   4   AIG8   4   Caterpillar4   5   Boeing0   7   Apple2   7   Amazon9   9   Colgate-Palmolivetoy.sort_values(by = 'labels', axis = 1) # Returns an exceptionKeyError: 'labels'
查看完整描述

6 回答

?
守候你守候我

TA贡献1802条经验 获得超10个赞

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


查看完整回答
反对 回复 2021-09-25
?
Helenr

TA贡献1780条经验 获得超4个赞

在上面的评论和答案中添加一个例子:


假设您有一个如下所示的数据框:


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排序。在这里它不会改变任何东西,因为 forindex 4因为5小于8并且默认情况下排序是ascending. 但是,如果你执行df.sort_values('1',axis=1)其中值下label超过companies,你将看到的位置labels,并companies已被更换。


    companies   labels

0   9           7

1   1           4

2   6           7

3   1           1

4   8           5


查看完整回答
反对 回复 2021-09-25
?
繁星coding

TA贡献1797条经验 获得超4个赞

只是为了在我们选择axis=1或时了解要清除的轴和行axis=0。


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

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

让我们假设一个数据帧如下:


>>> 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


查看完整回答
反对 回复 2021-09-25
  • 6 回答
  • 0 关注
  • 307 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号