将float转换为int并保留空值

时间:2016-09-25 19:09:25

标签: python pandas numpy

我有以下数据框,我想将列'b'中的值转换为整数

    a   b       c
0   1   NaN     3
1   5   7200.0  20
2   5   580.0   20

以下代码抛出异常 “ValueError:无法将NA转换为整数”

df['b'] = df['b'].astype(int)

如何仅将浮点数转换为int并保留空值?

4 个答案:

答案 0 :(得分:2)

np.NaN只是浮点数,因此必须将其删除才能创建整数pd.Series。 Jeon的建议工作很棒如果0不是df['b']中的有效值。例如:

import pandas as pd
import numpy as np

df = pd.DataFrame({'a': [1, 5, 5], 'b': [np.NaN, 7200.0, 580.0], 'c': [3, 20, 20]})
print(df, '\n\n')

df['b'] = np.nan_to_num(df['b']).astype(int)

print(df)

如果有效0,那么您可以先用一些唯一值(例如-999999999)替换它们,即上面的转换,然后将这些唯一值替换为0' / p>

无论哪种方式,你必须记住,你曾经有过NaN的0。在进行各种数值分析(例如,平均值等)时,您需要小心过滤掉这些

答案 1 :(得分:1)

当您的系列包含浮点数和 nan 并且您想转换为整数时,当您尝试将浮点数转换为 numpy 整数时,您将收到错误消息,因为有 na 值。

不要做:

df['b'] = df['b'].astype(int)

从 pandas >= 0.24 开始,现在有一个内置的 pandas 整数。这确实允许整数nan。注意 'Int64' 中的大写。这是熊猫整数,而不是 numpy 整数。

所以,这样做:

df['b'] = df['b'].astype('Int64')

有关pandas integer na 值的更多信息:
https://pandas.pydata.org/pandas-docs/stable/user_guide/gotchas.html#nan-integer-na-values-and-na-type-promotions

答案 2 :(得分:0)

类似的答案是TSeymour,但现在使用的是熊猫的fillna:

import pandas as pd
import numpy as np

df = pd.DataFrame({'a': [1, 5, 5], 'b': [np.NaN, 7200.0, 580.0], 'c': [3, 20, 20]})
print(df, '\n\n')

df['b'] = df['b'].fillna(0).astype(int)
print(df)

哪个给:

   a       b   c
0  1     NaN   3
1  5  7200.0  20
2  5   580.0  20 


   a     b   c
0  1     0   3
1  5  7200  20
2  5   580  20

答案 3 :(得分:0)

使用熊猫notnull函数选择非NaN的变量值。然后,使用astype函数将这些变量分配为int类型:

df[df[0].notnull()] = df[df[0].notnull()].astype(int)

我使用索引号使此解决方案更通用。当然,您始终可以使用如下列名进行指定:df['name_of_column']