2016-10-25 21 views
1

Cabin_Fare.Cabin.head(20)(產生這些結果)str.ljust()(使用於值進行排序)

583 A10 
208 A11 
475 A14 
556 A16 
331 A18 
284 A19 
599 A20 
28  A21 
630 A23 
867 A24 
647 A26 
112 A29 
209 A31 
185 A32 
445 A34 
293 A34 
374 A34 
806 A36 
96  A5 
23  A6 

不產生變化,以大熊貓柱(系列)我將其分配給x和轉換該對象類型爲字符串類型。

x = Cabin_Fare.Cabin.astype('string') 

我試圖把像A5/A6(最後兩個值)一個空間到左邊的值,因爲當列進行排序,只有2的LEN任何值不被正確排序。我假設,因爲他們沒有平等對齊的那些值有3的len值。

所以我試圖運行此代碼,但我沒有看到任何更改(A5/A6沒有被推動一個空間到左)

for i in x[x.notnull()]: 
    if len(i) == 2: 
     i= i.ljust(3,) 

編輯:我試圖利用Boud的解決方案,我遇到一個問題,因爲有值/實例,其中僅信(無數字)是存在的。 錯誤顯示爲:

ValueError: invalid literal for long() with base 10: '' 

爲了規避這一點,我想,「0」添加到其中只有信是存在的價值。

for i in x: 
    if len(i)==1: 
     i = i+'0' 

但是,這些變化並沒有超出循環內部的範圍。

+1

'df.Cabin.str.ljust(3)'做你想做的一切。如果你有一個排序問題,然後問這個問題。 – piRSquared

+0

哇,你是對的。我不明白爲什麼我的循環不起作用。當我運行循環時,儘管沒有錯誤,A5和A6並沒有像我在運行代碼時那樣被推到左邊。 – Moondra

回答

1

實際上,您的值沒有領先的空間。按字符串排序將應用字母順序,即字符。所有字符串以A開頭,然後第二個字符是數字,而5和6是在您的示例中大於0,1,2和3的數字。所以數字被認爲是數字,但作爲一個單一的數字序列。

如果你想有一個排序如下A的數字,通過移除第一個字符提取數,轉換成int,那種系列爲int,然後根據所得的,適當的排序指數重新編制x

x.reindex(x.str[1:].astype(int).sort_values().index) 
Out[57]: 
18  A5 
19  A6 
0  A10 
1  A11 
2  A14 
3  A16 
4  A18 
5  A19 
6  A20 
7  A21 
8  A23 
9  A24 
10 A26 
11 A29 
12 A31 
13 A32 
14 A34 
15 A34 
16 A34 
17 A36 
Name: Cabin, dtype: object 
+0

由於某種原因,當我在整個系列上運行上面的代碼(不僅僅是示例),我得到這個錯誤: 'ValueError:無效字面值long()與基數10:''' 你有什麼想法問題可能是什麼?我確實做了一些數據清理,如果在一個插槽中有多個值,我會刪除一些值。 – Moondra

+1

這意味着你有條目說只有一個字符,所以第一個和唯一的字符被刪除,並且astype不能轉換它 – Boud

+0

啊! Thanks.To解決這個問題,我想補充 '0' 到那裏是通過迭代只有一個字符的條目: '因爲我在X: \t如果len(I)== 1: \t \t我= i +'0'' 但是,更改只發生在for循環中;一旦在循環之外,變化就不存在。 我在這裏寫了代碼,但如果它是難以辨認的,我會更新OP。 非常感謝您的幫助。 – Moondra

相關問題