在Pandas中将浮动转换为int?

时间:2014-01-22 18:42:16

标签: python pandas floating-point integer dataset

我一直在处理从CSV导入的数据。 Pandas将一些列更改为float,所以现在这些列中的数字显示为浮点数!但是,我需要将它们显示为整数,或者不使用逗号。有没有办法将它们转换为整数或不显示逗号?

11 个答案:

答案 0 :(得分:166)

要修改浮点输出,请执行以下操作:

df= pd.DataFrame(range(5), columns=['a'])
df.a = df.a.astype(float)
df

Out[33]:

          a
0 0.0000000
1 1.0000000
2 2.0000000
3 3.0000000
4 4.0000000

pd.options.display.float_format = '{:,.0f}'.format
df

Out[35]:

   a
0  0
1  1
2  2
3  3
4  4

答案 1 :(得分:137)

使用.astype(<type>)功能操作列dtypes。

>>> df = pd.DataFrame(np.random.rand(3,4), columns=list("ABCD"))
>>> df
          A         B         C         D
0  0.542447  0.949988  0.669239  0.879887
1  0.068542  0.757775  0.891903  0.384542
2  0.021274  0.587504  0.180426  0.574300
>>> df[list("ABCD")] = df[list("ABCD")].astype(int)
>>> df
   A  B  C  D
0  0  0  0  0
1  0  0  0  0
2  0  0  0  0

编辑:

处理缺失值:

>>> df
          A         B     C         D
0  0.475103  0.355453  0.66  0.869336
1  0.260395  0.200287   NaN  0.617024
2  0.517692  0.735613  0.18  0.657106
>>> df[list("ABCD")] = df[list("ABCD")].fillna(0.0).astype(int)
>>> df
   A  B  C  D
0  0  0  0  0
1  0  0  0  0
2  0  0  0  0
>>>

答案 2 :(得分:25)

使用列名列表,使用.applymap()更改多列的类型,或使用.apply()更改单列的类型。

    df = pd.DataFrame(10*np.random.rand(3, 4), columns=list("ABCD"))

              A         B         C         D
    0  8.362940  0.354027  1.916283  6.226750
    1  1.988232  9.003545  9.277504  8.522808
    2  1.141432  4.935593  2.700118  7.739108

    cols = ['A', 'B']
    df[cols] = df[cols].applymap(np.int64)

       A  B         C         D
    0  8  0  1.916283  6.226750
    1  1  9  9.277504  8.522808
    2  1  4  2.700118  7.739108

    df['C'] = df['C'].apply(np.int64)
       A  B  C         D
    0  8  0  1  6.226750
    1  1  9  9  8.522808
    2  1  4  2  7.739108

答案 3 :(得分:5)

import pandas as pd;
right = pd.DataFrame({'C': [1.002, 2.003],
               'D': [1.009, 4.55],
                "key":['K0', 'K1']})


           C    D   key
0   1.002   1.009   K0
1   2.003   4.550   K1

right['C'] = right.C.astype(int)

       C    D   key
0   1   1.009   K0
1   2   4.550   K1

答案 4 :(得分:5)

如果您希望将Pandas DataFrame df的更多列从float转换为整数,这是一个快速解决方案,同时考虑到您可以拥有NaN值的情况。

cols = ['col_1', 'col_2', 'col_3', 'col_4']
for col in cols:
   df[col] = df[col].apply(lambda x: int(x) if x == x else "")

我尝试过:

 else x)
 else None)

但结果仍然是浮点数,所以我使用了else ""

答案 5 :(得分:4)

扩展@Ryan G提到的.astype(<type>)函数的用法,可以使用errors=ignore参数仅转换那些不会产生错误的列,从而显着简化了语法。显然,在忽略错误时应格外小心,但对于此任务来说非常方便。

df = pd.DataFrame(np.random.rand(3,4), columns=list("ABCD"))
df['E'] = list("XYZ")
df.astype(int, errors='ignore')

    A   B   C   D   E
0   0   0   0   0   X
1   0   0   0   0   Y
2   0   0   0   0   Z

来自astype文档:

  

错误:{'raise','ignore'},默认为'raise'

     

控制针对提供的dtype的无效数据引发异常。

     
      
  • raise:允许引发异常
  •   
  • 忽略:抑制异常。错误时返回原始对象
  •   
     

0.20.0版中的新功能。

答案 6 :(得分:2)

**

要将所有浮点列转换为int

**

df = pd.DataFrame(np.random.rand(5,4) * 10, columns=list("PQRS"))

df
    P           Q           R           S
0   4.395994    0.844292    8.543430    1.933934
1   0.311974    9.519054    6.171577    3.859993
2   2.056797    0.836150    5.270513    3.224497
3   3.919300    8.562298    6.852941    1.415992
4   9.958550    9.013425    8.703142    3.588733


float_col = df.select_dtypes(include = ['float64']) # This will select float columns only
# list(float_col.columns.values)
for col in float_col.columns.values:
    df[col] = df[col].astype('int64')

df

    P   Q   R   S
0   4   0   8   1
1   0   9   6   3
2   2   0   5   3
3   3   8   6   1
4   9   9   8   3

答案 7 :(得分:1)

也可以在字典中提到需要转换为int的列,如下所示:

df = df.astype({'col1': 'int', 'col2': 'int', 'col3': 'int'})

答案 8 :(得分:0)

这是一个简单的函数,它将向下转换为不会丢失任何信息的最小可能整数类型。例如,

  • 100.0可以从float转换为整数,但不能99.9(不能将信息丢失到舍入或截断)

  • 此外,1.0可以一直向下转换到int8,而不会丢失信息,但是100_000.0的最小整数类型是int32

代码示例:

import numpy as np
import pandas as pd

def float_to_int( s ):
    if ( s.astype(np.int64) == s ).all():
        return pd.to_numeric( s, downcast='integer' )
    else:
        return s

# small integers are downcast into 8-bit integers
float_to_int( np.array([1.0,2.0]) )
Out[1]:array([1, 2], dtype=int8)

# larger integers are downcast into larger integer types
float_to_int( np.array([100_000.,200_000.]) )
Out[2]: array([100000, 200000], dtype=int32)

# if there are values to the right of the decimal
# point, no conversion is made
float_to_int( np.array([1.1,2.2]) )
Out[3]: array([ 1.1,  2.2])

答案 9 :(得分:0)

正如问题文本中解释的数据来自 csv,我认为在导入转换后避免这种情况的选项与主题相关。

在数据框中导入电子表格或 csv 时,“仅整数列”通常会转换为浮点数,因为 excel 将所有数值存储为浮点数以及基础库的工作原理。

当使用 read_excelread_csv 读取文件时,有几个选项可以避免导入后转换:

  • 参数 dtype 允许传递列名和目标类型的字典,例如 dtype = {"my_column": "Int64"}
  • 参数 converters 可用于传递进行转换的函数,例如将 NaN 更改为 0。converters = {"my_column": lambda x: int(x) if x else 0}
  • parameter convert_float 会将“整数浮点数转换为 int(即 1.0 –> 1)”,但要注意 NaN 等极端情况。此参数仅在 read_excel
  • 中可用

为了在现有数据帧中进行转换,其他评论中给出了几种替代方案,但自 v1.0.0 以来,pandas 在这种情况下有一个有趣的功能:convert_dtypes,即“使用 dtypes 将列转换为最佳数据类型支持 pd.NA。"

例如:

In [3]: import numpy as np                                                                                                                                                                                         

In [4]: import pandas as pd                                                                                                                                                                                        

In [5]: df = pd.DataFrame( 
   ...:     { 
   ...:         "a": pd.Series([1, 2, 3], dtype=np.dtype("int64")), 
   ...:         "b": pd.Series([1.0, 2.0, 3.0], dtype=np.dtype("float")), 
   ...:         "c": pd.Series([1.0, np.nan, 3.0]), 
   ...:         "d": pd.Series([1, np.nan, 3]), 
   ...:     } 
   ...: )                                                                                                                                                                                                          

In [6]: df                                                                                                                                                                                                         
Out[6]: 
   a    b    c    d
0  1  1.0  1.0  1.0
1  2  2.0  NaN  NaN
2  3  3.0  3.0  3.0

In [7]: df.dtypes                                                                                                                                                                                                  
Out[7]: 
a      int64
b    float64
c    float64
d    float64
dtype: object

In [8]: converted = df.convert_dtypes()                                                                                                                                                                            

In [9]: converted.dtypes                                                                                                                                                                                           
Out[9]: 
a    Int64
b    Int64
c    Int64
d    Int64
dtype: object

In [10]: converted                                                                                                                                                                                                 
Out[10]: 
   a  b     c     d
0  1  1     1     1
1  2  2  <NA>  <NA>
2  3  3     3     3

答案 10 :(得分:-3)

df_18['cyl'].value_counts()

4.0 365

6.0 246

8.0 153

名称:cyl,dtype:int64 在[38]中:

INT 的 df_18 [ 'CYL'] = df_18 [ '缸']。astype(int)的

4 365

6 246

8 153

名称:cyl,dtype:int64