当在int类型的pd.DataFrame中替换所有-1到np.NaN时,某些int变为float

时间:2017-10-20 03:31:19

标签: 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

1 个答案:

答案 0 :(得分:2)

因此:

>>> type(np.nan)
float

如果您的列中有NaN,则列的其余部分会自动上传到float以进行有效计算。

要解决此问题,请将dtype转换为object,我不建议这样做,除非它仅用于显示目的(以这种方式杀死效率)。

m = b.dtypes == type(np.nan)
b.loc[:, m] = b.loc[:, m].astype(object)

print(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