将float Series中的所有元素转换为整数

时间:2015-10-15 21:21:34

标签: python pandas casting series

我在数据框中有一个具有浮点值的列(所以我将此列称为Float系列)。我想将所有值转换为整数或只是将其四舍五入,以便没有小数。

我们说数据帧是df,列是a,我试过这个:

SaveImage(dataURL, saveLocation);

public bool SaveImage(string imageString, string location)
{
    try {
        imageString = imageString.Substring(imageString.IndexOf(',') + 1);
        byte[] bytes = Convert.FromBase64String(imageString);

        using (FileStream fs = new FileStream(location, FileMode.Create))
        {
            fs.Write(bytes, 0, bytes.Count);
        }
    }
    catch(Exception)
    {
        return false;
    }
    return true;
}

我收到错误消息称此方法无法应用于系列,仅适用于单个值。

接下来我尝试了这个:

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

在此之后我打印了df,但没有变化。 我哪里错了?

4 个答案:

答案 0 :(得分:6)

round无法正常工作,因为它是在类似数组而不是标量值的pandas系列上调用的,有内置方法pd.Series.round可以在整个Series数组上运行您可以使用astype更改dtype:

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未发生变异的原因。

答案 1 :(得分:2)

循环中的代码:

obj = int(round(obj))

仅对名称为obj的对象所引用的更改。它不会修改系列中存储的数据。如果您想这样做,您需要知道数据存储在系列中的哪个位置并在那里进行更新。

E.g。

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

答案 2 :(得分:2)

当将float转换为整数时,我发现使用df.dtypes,我试图舍入的列是一个不是浮点数的对象。 round命令不能用于对象,所以我做了转换:

df ['a'] = pd.to_numeric(df ['a'])
df ['a'] = df ['a']。round(0).astype(int)

或作为一行:

df['a'] = pd.to_numeric(df['a']).round(0).astype(int)

答案 3 :(得分:1)

如果您特别希望将问题说明为向上,则可以使用np.ceil

import numpy as np
df['a'] = np.ceil(df['a']) 

另见Floor or ceiling of a pandas series in python?

不确定输入转换为int有多大优势;大熊猫和numpy爱花车。