将float转换为int并保留null

bil*_*ard 5 python numpy pandas

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

    a   b       c
0   1   NaN     3
1   5   7200.0  20
2   5   580.0   20
Run Code Online (Sandbox Code Playgroud)

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

df['b'] = df['b'].astype(int)
Run Code Online (Sandbox Code Playgroud)

如何将仅浮点数转换为int并保持原样为空?

San*_*ord 10

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

不要这样做:

df['b'] = df['b'].astype(int)
Run Code Online (Sandbox Code Playgroud)

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

所以,这样做:

df['b'] = df['b'].astype('Int64')
Run Code Online (Sandbox Code Playgroud)

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


TSe*_*our 6

np.NaN是浮点唯一类型的东西,因此必须将其删除才能创建整数 pd.Series。如果 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)
Run Code Online (Sandbox Code Playgroud)

如果有有效的 0,那么您可以先将它们全部替换为某个唯一值(例如,-999999999),即上面的转换,然后将这些唯一值替换为 0。

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