我一直在处理从CSV导入的数据。 Pandas将一些列更改为float,所以现在这些列中的数字显示为浮点数!但是,我需要将它们显示为整数,或者不使用逗号。有没有办法将它们转换为整数或不显示逗号?
答案 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)
**
**
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_excel 或 read_csv 读取文件时,有几个选项可以避免导入后转换:
dtype
允许传递列名和目标类型的字典,例如 dtype = {"my_column": "Int64"}
converters
可用于传递进行转换的函数,例如将 NaN 更改为 0。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,即“使用 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