当两个数据框之一的一列具有所有空值(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没有提到问题,知道为什么熊猫有这种行为吗?
不允许在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。
使用Series.astype
在使用Series.astype
之前将C
设置为对象:
append