Python 在附加两个数据帧时,布尔值将变为浮点数

Python 在附加两个数据帧时,布尔值将变为浮点数,python,pandas,dataframe,append,Python,Pandas,Dataframe,Append,当其中一个数据帧的列具有所有空值(NaN),而另一个数据帧的同一列具有布尔值时,追加两个数据帧会出现意外行为。 结果(通过追加)数据帧中的对应列被类型化为float64,布尔值根据其原始布尔值转换为1和0。 例如: df1 = pd.DataFrame(data = [[1, 2 ,True], [10, 20, True]], columns=['a', 'b', 'c']) df1 a b c 0 1 2 True 1 10 20 False d

当其中一个数据帧的列具有所有空值(NaN),而另一个数据帧的同一列具有布尔值时,追加两个数据帧会出现意外行为。 结果(通过追加)数据帧中的对应列被类型化为float64,布尔值根据其原始布尔值转换为1和0。 例如:

df1 = pd.DataFrame(data = [[1, 2 ,True], [10, 20, True]], columns=['a', 'b', 'c'])   
df1
    a   b     c
0   1   2  True
1  10  20  False 

df2 = pd.DataFrame(data = [[1,2], [10,20]], columns=['a', 'b'])  
df2['c'] = np.nan
df2
    a   b   c
0   1   2 NaN
1  10  20 NaN
附加:

df1.append(df2)
    a   b    c
0   1   2  1.0
1  10  20  0.0
0   1   2  NaN
1  10  20  NaN
我的解决方法是将列的类型重置为bool,但这会将NaN值转换为booleans:

appended_df = df1.append(df2)
appended_df
    a   b    c
0   1   2  1.0
1  10  20  0.0
0   1   2  NaN
1  10  20  NaN

appended_df['c'] = appended_df.c.astype(bool)
appended_df
    a   b      c
0   1   2   True
1  10  20  False
0   1   2   True
1  10  20   True

不幸的是,没有提到这个问题,您知道熊猫为什么会有这种行为吗?

数据框列中不允许混合类型的元素,请参阅此讨论

np.nan的类型是float,因此所有布尔值在追加时都转换为float。为了避免这种情况,可以使用.astype()将“c”列的类型更改为“object”:

然后append命令会得到所需的结果。但是,正如上面提到的讨论中所述,不建议在同一列中使用多种类型。如果不使用np.nan,而是使用None,即NoneType对象,则无需亲自查看类型定义。有关NaN(不是数字)和None类型之间的差异,请参见


您应该考虑“c”列真正代表什么,并相应地选择数据类型

如果您使用的是Pandas 1.0.0及更高版本,则需要使用convert_dtypes。有关说明和使用,请参阅链接

解决方案代码:

df1 = df1.convert_dtypes()
df1.append(df2)

print(df1)

这是因为您在append语句中明确声明了
.astype(bool)
,所以它将所有1和0设置为T/F值。不,实际上我使用
.astype(bool)
只是为了解决问题,这与问题无关。
df1 = df1.convert_dtypes()
df1.append(df2)

print(df1)