2013-11-29 72 views
15

按列的值排序熊貓數據框是可行的,還可以通過索引來排序嗎?在一個列和索引的值上對pandas數據框進行排序?

如果您按列的值對熊貓數據框進行排序,則可以得到按列排序的結果數據框,但不幸的是,您會在排序列的相同值內看到數據框索引凌亂的順序。

那麼,我可以按列排序一個數據幀,例如名爲count的列,但也可以按索引的值對它排序?按降序對列進行排序也是可行的,但是按升序對索引進行排序?

我知道如何對數據框中的多個列進行排序,也知道我可以通過首先對這個索引reset_index()進行索引並對其進行排序,然後再次創建索引。但是,更直觀,更高效的方法呢?

回答

1

要列排序下降,同時保持指數上升:

import pandas as pd 
df = pd.DataFrame(index=range(5), data={'c': [4,2,2,4,2]}) 
df.index = df.index[::-1] 
print df.sort(column='c', ascending=False) 

輸出:

c 
1 4 
4 4 
0 2 
2 2 
3 2 
+2

感謝。但是這會導致索引的破壞,在某些情況下我可能不喜歡索引,因此仍然更喜歡'reset_index()'...感謝您的回答。 – Blaszard

+0

「破壞指數」是什麼意思? – cyborg

+0

這將破壞多指令。您可以在[docs](http://pandas.pydata.org/pandas-docs/stable/advanced.html)中的多索引示例之一上嘗試此操作。我會發布代碼,但它作爲評論基本上是不可讀的。 – Russ

1

可以使用GROUPBY的組合和應用:

In [2]: df = pd.DataFrame({ 
      'transID': range(8), 
      'Location': ['New York','Chicago','New York','New York','Atlanta','Los Angeles', 
          'Chicago','Atlanta'], 
      'Sales': np.random.randint(0,10000,8)}).set_index('transID') 
In [3]: df 
Out[3]: 
     Location Sales 
transID 
0  New York 1082 
1  Chicago  1664 
2  New York 692 
3  New York 5669 
4  Atlanta  7715 
5  Los Angeles 987 
6  Chicago  4085 
7  Atlanta  2927 

In [4]: df.groupby('Location').apply(lambda d: d.sort()).reset_index('Location',drop=True) 
Out[4]: 
     Location Sales 
transID 
4  Atlanta  7715 
7  Atlanta  2927 
1  Chicago  1664 
6  Chicago  4085 
5  Los Angeles 987 
0  New York 1082 
2  New York 692 
3  New York 5669 

我在最後一行放置「位置」,因爲groupby會將分組級別插入到第一個位置該指數。排序然後刪除它們可以保留排序的順序。

13

我敢打賭,最簡單的方法就是將索引複製到列中,然後按兩者排序。

df['colFromIndex'] = df.index 
df = df.sort(['count', 'colFromIndex']) 

我還希望能夠做一些像df.sort(['count', 'index']),但當然不起作用。

+0

奇怪的是,當我嘗試這樣做時,它仍然只對'count'列和'colFromIndex'列進行排序...... – durbachit

+2

注意:sort已被棄用。 sort_values現在正在使用中。 – wwl

-9

我解決這個問題,接下來的方式:

df.to_csv('df.csv', index = False) 
df = df.read_csv('df.csv') 
+1

與此無關嗎? – clg4

-1

我認爲,從sort_values原來的順序保持甚至當施加sort_index,所以這應該工作:

df.sort_values('count', ascending=False).sort_index(level=[index_level1, index_level2]) 
+0

我已經嘗試過,原來的順序並不是這樣。 – wesanyer

相關問題