在Pandas中将浮点数转换为整数?


230

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


22
您可以更改类型(只要没有缺失值)df.col = df.col.astype(int)
EdChum 2014年

该问题同时是两个问题,并且该问题的标题仅反映其中一个。
莫妮卡·赫德内克

对于满足以上条件并发现它在概念上有用但对您不起作用的人们而言,这是在Pandas X的python 3.7.5中为我工作的版本: df = df.astype(int)
Pandas

Answers:


216

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

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

16
谢谢!我在to_csv中对此进行了调整:fin.to_csv('my_table.csv',float_format ='%。f')。有效!
MJP 2014年

4
在最新版本的熊猫中,您需要在astype的参数中添加copy = False以避免发出警告
g.stevo

需要这样做df.a = df.a.astype(float)吗?这会复制吗(不确定如何使用copy参数astype())?无论如何要更新类型“到位”?
Mr_and_Mrs_D

1
@EdChum,有没有一种方法可以防止Pandas转换类型?例如,请尝试DF.({'200': {'#': 354, '%': 0.9971830985915493}, '302': {'#': 1, '%': 0.0028169014084507044}}) 注意将#转换为float,它们是行而不是列。因为每个都是Series只能存储一个统一类型的a?
alancalvitti

@alancalvitti您在这里打算保留值还是dtype?如果是这样,dtype则需要创建这些列,dtype object以便允许混合使用,否则我的建议是只使用float并在进行比较时使用np.isclose
EdChum

180

使用该pandas.DataFrame.astype(<type>)函数操作列dtype。

>>> 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

3
我尝试了您的方法,它给了我ValueError:无法将NA转换为整数
MJP 2014年

6
@MJP如果缺少值,则无法将序列从float转换为整数,请参阅pandas.pydata.org/pandas-docs/stable/…,您必须使用float
EdChum 2014年

2
不会丢失这些值,但是该列并未故意为每一行指定一个值。有什么办法可以解决吗?由于这些值是外键ID,因此我需要整数。
MJP

4
我进行了编辑,其中所有NaN都替换为0.0。
Ryan G

3
或更妙的是,如果您只修改CSV,则:df.to_csv(“ path.csv”,na_rep =“”,float_format =“%。0f”,index = False)但这将编辑所有浮点数,因此最好将FK列转换为字符串,进行操作,然后保存。
Ryan G

44

考虑以下数据帧:

>>> df = pd.DataFrame(10*np.random.rand(3, 4), columns=list("ABCD"))
>>> print(df)
...           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

使用列名列表,使用来更改多个列的类型applymap()

>>> cols = ['A', 'B']
>>> df[cols] = df[cols].applymap(np.int64)
>>> print(df)
...    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

或单列apply()

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

5
如果值中包含NaN怎么办?
18年

3
@ Zhang18我尝试了此解决方案,如果发生NaN,您会遇到此错误:ValueError: ('cannot convert float NaN to integer', u'occurred at index <column_name>')
enri 2015年

2
@enri:可以尝试以下代码df['C'] = df['C'].dropna().apply(np.int64)
vsdaking

12

如果您要同时pandas.DataFrame考虑NaN值的情况,这是一种快速的解决方案,可以将更多的列从float 转换为integer。

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 ""


它将应用于""col
Raheel

如果需要,它将对所有缺少的值应用空字符串(“”),但其余值将是整数。
KrzysztofSłowiński18年

谢谢你 当.astype()和.apply(np.int64)不起作用时,此方法起作用。
艾莉森·S

这感觉很骇人,我认为没有理由在许多可用的替代方法上使用它。
AMC

8

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

>>> df = pd.DataFrame(np.random.rand(3, 4), columns=list('ABCD'))
>>> df *= 10
>>> print(df)
...           A       B       C       D
... 0   2.16861 8.34139 1.83434 6.91706
... 1   5.85938 9.71712 5.53371 4.26542
... 2   0.50112 4.06725 1.99795 4.75698

>>> df['E'] = list('XYZ')
>>> df.astype(int, errors='ignore')
>>> print(df)
...     A   B   C   D   E
... 0   2   8   1   6   X
... 1   5   9   5   4   Y
... 2   0   4   1   4   Z

pandas.DataFrame.astype文档:

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

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

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

0.20.0版中的新功能。


7
>>> import pandas as pd
>>> right = pd.DataFrame({'C': [1.002, 2.003], 'D': [1.009, 4.55], 'key': ['K0', 'K1']})
>>> print(right)
           C      D key
    0  1.002  1.009  K0
    1  2.003  4.550  K1
>>> right['C'] = right.C.astype(int)
>>> print(right)
       C      D key
    0  1  1.009  K0
    1  2  4.550  K1

5

将所有浮点列转换为int

>>> df = pd.DataFrame(np.random.rand(5, 4) * 10, columns=list('PQRS'))
>>> print(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')
>>> print(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

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])

0

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

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

-5
>>> df_18['cyl'].value_counts()
... 4.0     365
... 6.0     246
... 8.0     153

>>> df_18['cyl'] = df_18['cyl'].astype(int)
>>> df_18['cyl'].value_counts()
... 4     365
... 6     246
... 8     153

1
astype(int)已经被提及过几次了。此答案不会添加任何新内容。
乔治,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.