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