将浮点数转换为整数在熊猫?

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

908801 次浏览

使用pandas.DataFrame.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

要修改浮点数输出,可以这样做:

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

考虑以下数据帧:

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

这是一个快速的解决方案,如果你想将你的pandas.DataFrame的更多列从浮点数转换为整数,同时考虑到你可以有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 ""

将所有浮点列转换为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

扩展@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 docs:

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

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

  • Raise:允许抛出异常
  • Ignore:抑制异常。错误时返回原始对象

0.20.0新版功能。

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

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

在问题的文本中解释了数据来自csv。Só,我认为显示选项,使转换时,数据读取,而不是之后,是相关的主题。

当在数据帧中导入电子表格或csv时,“只有整数列”;通常转换为浮点数,因为excel将所有数值存储为浮点数以及底层库的工作方式。

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

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

要在现有的数据帧中进行转换,其他注释中已经给出了几种替代方案,但由于v1.0.0 pandas在这种情况下有一个有趣的函数:convert_dtypes,即“使用支持pd.NA的dtypes将列转换为最佳的dtypes”;

为例:

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


使用'Int64'来支持NaN

  • astype(int)astype('int64') 不能处理缺失的值(numpy int)
  • astype('Int64')(注意大写I) 可以处理缺失值 (熊猫int)
df['A'] = df['A'].astype('Int64') # capital I

这假设您希望将缺失的值保留为NaN。如果你打算赋值它们,你可以先fillna 正如瑞安所说


'Int64'(大写I)的例子

  1. 如果浮点数已经四舍五入,只需使用astype:

    df = pd.DataFrame({'A': [99.0, np.nan, 42.0]})
    
    
    df['A'] = df['A'].astype('Int64')
    #       A
    # 0    99
    # 1  <NA>
    # 2    42
    
  2. 如果浮点数是四舍五入,则roundastype之前:

    df = pd.DataFrame({'A': [3.14159, np.nan, 1.61803]})
    
    
    df['A'] = df['A'].round().astype('Int64')
    #       A
    # 0     3
    # 1  <NA>
    # 2     2
    
  3. 要从文件中读取int+NaN数据,可以使用dtype='Int64'来完全避免转换的需要:

    csv = io.StringIO('''
    id,rating
    foo,5
    bar,
    baz,2
    ''')
    
    
    df = pd.read_csv(csv, dtype={'rating': 'Int64'})
    #     id  rating
    # 0  foo       5
    # 1  bar    <NA>
    # 2  baz       2
    

笔记

  • 'Int64'Int64Dtype的别名:

    df['A'] = df['A'].astype(pd.Int64Dtype()) # same as astype('Int64')
    
  • 大小/签名别名可用:

    下界 上界
    'Int8' -128年 127
    'Int16' -32768年 32767年
    'Int32' -2147483648年 2147483647年
    'Int64' -9223372036854775808年 9223372036854775807年
    'UInt8' 0 255
    'UInt16' 0 65535年
    'UInt32' 0 4294967295年
    'UInt64' 0 18446744073709551615年
    李< / div > < / >
虽然这里有很多选择, 您还可以使用字典

来转换特定列的格式
Data = pd.read_csv('Your_Data.csv')


Data_2 = Data.astype({"Column a":"int32", "Column_b": "float64", "Column_c": "int32"})


print(Data_2 .dtypes) # Check the dtypes of the columns

这是更改特定列的数据格式以进行快速数据分析的一种有用且非常快速的方法。