繁体   English   中英

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

[英]sort_values() in Pandas behaves contrary to documentation

我对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'

这是因为在示例中,轴0为“下”,轴为“右”(即跨列)。如果查看sort_values的文档,则会看到第一个参数的确是by ,而默认值是axis为0。因此,重复您的第一个示例,您需要执行toy.sort_values(by='labels', axis=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不止companies ,你会看到的位置labelscompanies已被更换。

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

希望这可以澄清。

只是为了了解轴和行,以便在选择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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM