2016-10-11 177 views
1

我有以下的數據幀:排序數據 - 熊貓數據幀

 As Comb  Mu(+) Name  Zone  f´c 
33 0.37 2 6.408225 Beam_13 Final 30.0 
29 0.37 2 6.408225 Beam_13 Begin 30.0 
31 0.94 2 16.408225 Beam_13 Middle 30.0 
15 0.54 2 9.504839 Beam_7 Final 30.0 
11 0.54 2 9.504839 Beam_7 Begin 30.0 
13 1.12 2 19.504839 Beam_7 Middle 30.0 

我需要一個組內由Name的數據,然後通過Zone排序如下圖所示的期望的輸出:

 As Comb  Mu(+) Name  Zone  f´c 
11 0.54 2 9.504839 Beam_7 Begin 30.0 
13 1.12 2 19.504839 Beam_7 Middle 30.0 
15 0.54 2 9.504839 Beam_7 Final 30.0 
29 0.37 2 6.408225 Beam_13 Begin 30.0 
31 0.94 2 16.408225 Beam_13 Middle 30.0 
33 0.37 2 6.408225 Beam_13 Final 30.0 

我可以按索引排序,但不能按Name組中的名稱和區域排序。有任何想法嗎?

回答

3

最簡潔的方法是將NameZone列轉換爲類別類型,並指定類別和順序。

from io import StringIO 

data = """ 
As,Comb,Mu(+),Name,Zone,f´c 
33,0.37,2,6.408225,Beam_13,Final,30.0 
29,0.37,2,6.408225,Beam_13,Begin,30.0 
31,0.94,2,16.408225,Beam_13,Middle,30.0 
15,0.54,2,9.504839,Beam_7,Final,30.0 
11,0.54,2,9.504839,Beam_7,Begin,30.0 
13,1.12,2,19.504839,Beam_7,Middle,30.0 
""" 

df = pd.read_csv(StringIO(data)) 

# convert Name and Zone to ordinal/category type 
df.Name = df.Name.astype('category', categories=["Beam_7", "Beam_13"], ordered=True) 
df.Zone = df.Zone.astype('category', categories=["Begin", "Middle", "Final"], ordered=True) 

df.sort_values(by=['Name', 'Zone']) 

下面是輸出:

enter image description here

其他選項可以發現here

+0

謝謝!偉大的工作! – Eduardo

+0

另一個問題:可以將Pandas列作爲類別?我有這樣的「梁」列表。 – Eduardo

+0

我不確定你的意思。上述方法將列轉換爲類別類型。也許考慮創造另一個問題。另外看看熊貓文檔[這裏](http://pandas.pydata.org/pandas-docs/stable/categorical.html) – shawnheide