Python 如何检查float列是否只包含整数?

Python 如何检查float列是否只包含整数?,python,pandas,floating-point,precision,Python,Pandas,Floating Point,Precision,我有一个数据帧 df = pd.DataFrame(data=np.arange(10),columns=['v']).astype(float) 如何确保v中的数字是整数? 我非常关心舍入/截断/浮点表示错误与astype(int) 暂时将列转换为int,并使用np.array_equal进行测试: np.array_equal(df.v, df.v.astype(int)) True float.is_整数 您可以将此python函数与apply结合使用: df.v.apply(flo

我有一个数据帧

df = pd.DataFrame(data=np.arange(10),columns=['v']).astype(float)
如何确保
v
中的数字是整数? 我非常关心舍入/截断/浮点表示错误

astype(int)
暂时将列转换为
int
,并使用
np.array_equal
进行测试:

np.array_equal(df.v, df.v.astype(int))
True

float.is_整数
您可以将此python函数与
apply
结合使用:

df.v.apply(float.is_integer).all()
True
或者,在生成器中使用python的
all
,以提高空间效率:

all(x.is_integer() for x in df.v)
True

如果要检查数据帧中的多个浮点列,可以执行以下操作:

col_should_be_int = df.select_dtypes(include=['float']).applymap(float.is_integer).all()
float_to_int_cols = col_should_be_int[col_should_be_int].index
df.loc[:, float_to_int_cols] = df.loc[:, float_to_int_cols].astype(int)
请记住,如果包含所有整数的浮点列具有
np.NaN
值,则不会选择该列。要将缺少值的浮点列强制转换为整数,您需要填充/删除缺少的值,例如,使用中值插补:

float_cols = df.select_dtypes(include=['float'])
float_cols = float_cols.fillna(float_cols.median().round()) # median imputation
col_should_be_int = float_cols.applymap(float.is_integer).all()
float_to_int_cols = col_should_be_int[col_should_be_int].index
df.loc[:, float_to_int_cols] = float_cols[float_to_int_cols].astype(int)

以下是一种更简单、可能更快的方法:

(df[col]%1==0).all()
要忽略空值,请执行以下操作:

(df[col].fillna(-9999)%1==0.all()
为完整起见,Pandas v1.0+提供了(在其他3种转换中)对仅包含整数的所有数据帧列(或序列)执行请求的操作

如果要将转换限制为仅一列,可以执行以下操作:

col_should_be_int = df.select_dtypes(include=['float']).applymap(float.is_integer).all()
float_to_int_cols = col_should_be_int[col_should_be_int].index
df.loc[:, float_to_int_cols] = df.loc[:, float_to_int_cols].astype(int)
>>df.dtypes#检查以前的数据类型
v浮动64
>>>df[“v”]=df[“v”].convert_dtype()
>>>df.d类型#检查转换的数据类型
v Int64

allclose与is_integer相比的容差是多少?它们是对同一函数的调用吗?@ErroriSalvo否,机制略有不同。对于
allclose
,对于浮点精度而言,公差非常小。当
为整数值时,函数实际上检查整数。机制略有不同,但最终结果是相同的。
allclose
无法确定数字是否为整数,除非公差设置为0,此时它将成为相等性测试。此外,正如我在对问题的评论中所述,测试整数值并不能达到OP的实际目标。@EricPostChil好的,我已经将其更改为array_equal。顺便说一句,这可能是一个XY问题,但知道如何处理numpy/熊猫仍然很有用,所以我还是继续回答了。我很欣赏批评(和否决票)。
df.v.apply
:不确定这是否有效,在
df.v
之后,这是一个不重要的问题,没有方法
apply
。你的意思是
沿_轴应用
?整数测试将如何消除对浮点错误的担忧?值是否来自整数,您是否担心它们已更改?或者它们是计算的结果,其数学性质使得精确的结果是整数?这些值来自整数。然而,在处理过程中,它们通常被强制转换为浮点64。在浮点运算中处理整数时可能出现的唯一错误是从一种格式转换为另一种格式时的舍入和溢出错误。将整数转换为浮点时,如果精度不足以精确表示值,则将对其进行四舍五入。但是,由于浮点的性质,它将被舍入到的值将是另一个整数。因此,测试数组中的所有值是否都是整数不会提供是否发生舍入错误的信息。如果任务是确保从整数转换为浮点的值不会产生任何舍入错误,然后,如果没有整数超过浮点格式有效位的精度,就足够了。例如,IEEE 754基本64位二进制文件具有53位有效位,因此,任何大小不超过2^53的整数的转换都不会产生任何舍入错误。