2015-10-15 39 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) 
相关问题