[追加两个熊猫数据框时,布尔值变成浮点数

问题描述 投票:1回答:2

当两个数据框之一的一列具有所有空值(NaN),而另一个数据框在同一列具有布尔值时,追加两个pandas数据框具有意外的行为。结果(附加)数据框中的相应列的类型为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值转换为布尔值:

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

不幸的是,pandas append documentation没有提到问题,知道为什么熊猫有这种行为吗?

python pandas dataframe append
2个回答
1
投票

不允许在DataFrame列中混合元素类型,请参见此讨论Mixed types of elements in DataFrame's column

np.nan的类型为float,因此在添加时所有布尔值都将强制转换为float。为了避免这种情况,您可以使用.astype():

将“ c”列的类型更改为“对象”
df1['c'] = df1['c'].astype(dtype='object')
df2['c'] = df2['c'].astype(dtype='object')

然后,append命令具有所需的结果。但是,如上所述,不建议在同一列中使用多种类型。如果使用None(它是NoneType对象)而不是np.nan,则不需要自己检查类型定义。有关NaN(非数字)和None类型之间的区别,请参见What is the difference between NaN and None?

您应该考虑'c'列的真正含义,并相应地选择dtype。


0
投票

使用Series.astype在使用Series.astype之前将C设置为对象:

append
© www.soinside.com 2019 - 2024. All rights reserved.