2015-10-15 40 views
3

我在一個數據框中有一個具有浮點值的列(所以我將此列稱爲Float系列)。我想將所有的值轉換爲整數,或者只是將其四捨五入,以便沒有小數。將float系列中的所有元素轉換爲整數

讓我們假設數據幀是DF和列是,我嘗試這樣做:

df['a'] = round(df['a']) 

我得到了一個錯誤說這種方法不能應用於系列,只適用於單個值。

接下來,我想這:

for obj in df['a']: 
    obj =int(round(obj)) 

這個我打印DF後卻沒有變化。 我哪裏錯了?

回答

2

在循環中的代碼:

obj = int(round(obj))

哪個對象名稱obj僅指變化。它不會修改系列中存儲的數據。如果你想這樣做,你需要知道數據存儲在哪裏,並在那裏更新。

E.g.

for i, num in enumerate(df['a']): 
    df['a'].iloc[i] = int(round(obj)) 
+0

出現一個野生downvote ... –

+0

我試過,但它並沒有幫助。 ILooks喜歡我們只是修改這裏的副本而不是實際值 –

+0

這被稱爲[鏈式索引](http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-複製),有時不工作,你必須做'df ['a']。iloc [i] = int(round(obj))' – EdChum

4

round不會因爲它被稱爲在熊貓系列是陣列狀的,而不是一個標量值工作,有內置的方法pd.Series.round整個系列陣列之後,您可以改變操作使用astype的D型:

In [43]: 
df = pd.DataFrame({'a':np.random.randn(5)}) 
df['a'] = df['a'] * 100 
df 

Out[43]: 
      a 
0 -4.489462 
1 -133.556951 
2 -136.397189 
3 -106.993288 
4 -89.820355 

In [45]: 
df['a'] = df['a'].round(0).astype(int) 
df 

Out[45]: 
    a 
0 -4 
1 -134 
2 -136 
3 -107 
4 -90 

而且它不需要遍歷行時有矢量化可用的方法

而且這樣的:

for obj in df['a']: 
    obj =int(round(obj)) 

不會突變系列中的單個單元格,它會在值的副本上進行操作,這就是爲什麼df未發生突變的原因。

+0

這個工作。謝謝。所以,這裏round既是一個內置函數,也是一個Series數組的屬性(我們在這裏使用的) –

+0

在技術上不是,它是一個Series的方法而不是一個屬性,但它可以作爲函數傳遞,取決於用法,最好不要由此得到太混亂 – EdChum

2

當將一個float轉換爲一個整數時,我發現使用df.dtypes,我試圖四捨五入的列是一個對象而不是浮點數。輪命令不會在對象上工作,所以做我做轉換:

DF [ '一'] = pd.to_numeric(DF [ '一'])
DF [ '一'] = DF [ 'A']。輪(0)。astype(INT)

或一條線:

df['a'] = pd.to_numeric(df['a']).round(0).astype(int) 
相關問題