[英]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
,你會看到的位置labels
和companies
已被更換。
companies labels
0 9 7
1 1 4
2 6 7
3 1 1
4 8 5
希望這可以澄清。
只是為了了解軸和行,以便在選擇axis=1
或axis=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.