python - 用 NaN 替换整数会导致整个列变成 float 据类型

标签 python pandas dataframe

首先,我做到了

a = [[6,5,4,3,2],[1,2,3,4,5,6],[3,4,5,6]]
b = pd.DataFrame(a)
print(b.head(2))

输出为

1   2   3   4   5      6
6   5   4   3   2.00   NaN
1   2   3   4   5.00   6.00
3   4   5   6   NaN    NaN

所以我就这么做了

a = [[6,5,4,3,2],[1,2,3,4,5,6],[3,4,5,6]]
b = pd.DataFrame(a).fillna(-1).astype(int)
print(b.head(2))   

输出变为

1   2   3   4   5   6
6   5   4   3   2   -1
1   2   3   4   5   6
3   4   5   6   -1  -1

但我不想要那些-1,所以我这样做了

a = [[6,5,4,3,2],[1,2,3,4,5,6],[3,4,5,6]]
b = pd.DataFrame(a).fillna(-1).astype(int)
b = b.replace(-1, np.NaN)
print(b.head(2))

输出再次与第一次相同

1   2   3   4   5      6
6   5   4   3   2.00   NaN
1   2   3   4   5.00   6.00
3   4   5   6   NaN    NaN

最佳答案

因为这个:

type(np.nan)
# float

如果您的列中有 NaN,则列的其余部分会自动向上转换为 float 以实现高效计算。

Pandas 0.24+

我们可以使用Nullable Integer Type允许整数与 NaN 共存:

b = b.astype('Int32')
b

   0  1  2  3    4    5
0  6  5  4  3    2  NaN
1  1  2  3  4    5    6
2  3  4  5  6  NaN  NaN

b.dtypes

0    Int32
1    Int32
2    Int32
3    Int32
4    Int32
5    Int32
dtype: object

<= 0.23

要解决这个问题,请将dtype转换为object,我不建议这样做,除非它仅用于显示目的(你杀死这样效率就高了)。

u = df.select_dtypes(float)
b[u.columns] = u.astype(object)
b

   0  1  2  3    4    5
0  6  5  4  3    2  NaN
1  1  2  3  4    5    6
2  3  4  5  6  NaN  NaN

print(b.dtypes)
0     int64
1     int64
2     int64
3     int64
4    object
5    object
dtype: object

关于python - 用 NaN 替换整数会导致整个列变成 float 据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46842005/

相关文章:

python - 从嵌套 xml 创建数据框并生成 csv

python - 列表理解等同于不产生一次性列表

python - 如何使用 Datashader + Bokeh 后端在 HoloViews 中进行链接数据选择

python - 使用 pandas 创建新列时的条件分割

python - 如何根据相同的虚拟向量对两个 Pandas 数据帧进行编码?

apache-spark - Spark 如何并行处理 1TB 文件?

r - 根据自定义条件合并数据框 - 字符串比较

python - 用python分割文件名

python:连接两个2维numpy数组以创建3维数组

python - 如何按列总数重新排序?