为什么替换多列会更改dtype

时间:2018-08-12 18:58:18

标签: pandas

为什么替换一个值会给object dtype,而替换两个值会给float64 dtype?

In [1]: import pandas as pd
In [2]: df = pd.DataFrame({'a': [1,2,3], 'b': [4,5,6]})

In [3]: df
Out[3]: 
   a  b
0  1  4
1  2  5
2  3  6
In [6]: df.replace({1: None})
Out[6]: 
      a  b
0  None  4
1     2  5
2     3  6

In [7]: df.replace({1: None, 5: None})
Out[7]: 
     a    b
0  NaN  4.0
1  2.0  NaN
2  3.0  6.0

In [8]: df.replace({1: None}).dtypes
Out[8]: 
a    object
b    object
dtype: object

In [9]: df.replace({1: None, 5: None}).dtypes
Out[9]: 
a    float64
b    float64
dtype: object

只需代码:

import pandas as pd
df = pd.DataFrame({'a': [1,2,3], 'b': [4,5,6]})
df.replace({1: None})
df.replace({1: None, 5: None})
df.replace({1: None}).dtypes
df.replace({1: None, 5: None}).dtypes

1 个答案:

答案 0 :(得分:2)

这似乎被埋在replace if / then逻辑中,该逻辑根据mapping的长度而有所不同

我要保持一致的行为,请不要使用None。使用np.nan

df.replace({1: np.nan})

     a    b
0  NaN  4.0
1  2.0  5.0
2  3.0  6.0

df.replace({1: np.nan, 5: np.nan})

     a    b
0  NaN  4.0
1  2.0  NaN
2  3.0  6.0

如果要替换一列,而让其他列保留,请传递一个嵌套的字典,该字典指定对哪一列执行的操作

df.replace({'a': {1: np.nan}})

     a  b
0  NaN  4
1  2.0  5
2  3.0  6

df.replace({'a': {1: np.nan}, 'b': {5: None}})

     a     b
0  NaN     4
1  2.0  None
2  3.0     6