2017-02-22 22 views
3

我想看看我是否可以從這個電話號碼列中刪除尾部零。如何在pandas中舍入/刪除traling「.0」零?

實施例:

0 
1  8.00735e+09 
2  4.35789e+09 
3  6.10644e+09 

在此列中的類型是一個對象,並且我試圖圓,但我正在一個錯誤。我檢查了其中的幾個,我知道它們的格式爲「8007354384.0」,並且想要去掉小數點後面的零。

有時我收到了這種格式,有時我不會,他們會是整數。我想檢查電話欄是否有尾隨零,然後將其刪除。

我有這個代碼,但我堅持如何檢查每行的尾隨零。

data.ix[data.phone.str.contains('.0'), 'phone'] 

我得到一個錯誤=>*** ValueError: cannot index with vector containing NA/NaN values。我相信這個問題是因爲有些行有空的數據,有時我收到。上面的代碼應該能夠跳過一個空行。

有沒有人有任何建議?我是熊貓新手,但迄今爲止它是一個有用的圖書館。您的幫助將不勝感激。

注意 上面提供的示例中,第一行有一個空數據,有時我會得到。只是爲了確保電話號碼沒有被表示爲0。

另外空數據被認爲是一個字符串,所以如果行是空的,它就是浮點數和字符串的混合。

回答

1

只是做

data['phone'] = data['phone'].astype(str) 
data['phone'] = data['phone].str.replace('.0', ' ') 

它使用的所有條目regex style lookup列並替換所有」 0.0' 與空白匹配。例如

data = pd.DataFrame(data = [['bob','39384954.0'],['Lina','23827484.0']], columns = ['user','phone'], index = [1,2]) 

data['phone'] = data['phone'].astype(str) 
data['phone'] = data['phone'].str.replace('.0', ' ') 
print data 

    user  phone 
1 bob 39384954 
2 Lina 23827484 
+0

我試圖做到這一點,但我得到一個錯誤=> *** TypeError:to_numeric()得到了一個意想不到的關鍵字參數'downcast''。這是我的代碼'pd.to_numeric(data.phone,errors ='ignore',downcast ='integer')' – medev21

+0

你有什麼版本的熊貓? – Nemo

+0

pandas版本是「0.18.1」 – medev21

2

使用astype(np.int64)

s = pd.Series(['', 8.00735e+09, 4.35789e+09, 6.10644e+09]) 
mask = pd.to_numeric(s).notnull() 
s.loc[mask] = s.loc[mask].astype(np.int64) 
s 

0    
1 8007350000 
2 4357890000 
3 6106440000 
dtype: object 
+0

這是不工作的,因爲在第一行的空數據,'*** ValueError:無效字面值long()以10爲基數:'''。我不熟悉dtype對象,但看起來這是一個字符串。如我錯了請糾正我。 – medev21

+0

我注意到,由於第一行是一個空的數據,它被認爲是一個字符串,它會引發錯誤。有沒有辦法繞過它? – medev21

+0

你想要結果是爲那一行。 – piRSquared

0

這取決於電話號碼存儲的數據格式。

如果是在一個數字小格式改變爲一個整數可能會解決這個問題

df = pd.DataFrame({'TelephoneNumber': [123.0, 234]}) 
df['TelephoneNumber'] = df['TelephoneNumber'].astype('int32') 

如果真的是可以更換和重新分配的列中輸入字符串。

df2 = pd.DataFrame({'TelephoneNumber': ['123.0', '234']}) 
df2['TelephoneNumber'] = df2['TelephoneNumber'].str.replace('.0', '') 
1

在熊貓/ NumPy的,整數不準取NaN值,和陣列/系列(包括列數據幀)是均勻的在它們的數據類型---所以具有整數的列中的某些條目是None/np.nan是徹頭徹尾的impossible。編輯:data.phone.astype('object') 應該做的伎倆;在這種情況下,Pandas會將您的列視爲一系列通用Python對象,而不是特定的數據類型(例如,str/float/int),如果您打算使用此數據運行任何繁重的計算(可能不是您的情況),則以性能爲代價。

假設你想保持這些NaN的條目,你轉換爲字符串的方法是有效的可能性:

data.phone.astype(str).str.split('.', expand = True)[0]

應該給你你在找什麼(有替代字符串的方法,你可以使用,如.replace.extract,但.split在這種情況下似乎是最直接的)。另外,如果你只對浮動的顯示感興趣(不太可能,我猜想),你可以做pd.set_option('display.float_format','{:.0f}'.format),這實際上並不影響你的數據。