pandas DataFrame combined_-first和update方法有奇怪的行为

2024-10-01 11:25:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我遇到了一个奇怪的问题(或者说是有意的?)其中,combine_firstupdate导致存储为bool的值被上推到float64s中,如果提供的参数没有提供布尔列。在

ipython中的工作流示例:

In [144]: test = pd.DataFrame([[1,2,False,True],[4,5,True,False]], columns=['a','b','isBool', 'isBool2'])

In [145]: test
Out[145]:
   a  b isBool isBool2
0  1  2  False    True
1  4  5   True   False


In [147]: b = pd.DataFrame([[45,45]], index=[0], columns=['a','b'])

In [148]: b
Out[148]:
    a   b
0  45  45

In [149]: test.update(b)

In [150]: test
Out[150]:
    a   b  isBool  isBool2
0  45  45       0        1
1   4   5       1        0

这是不是意味着update函数的行为?我认为,如果没有指定任何内容,update不会扰乱其他列。在


编辑:我开始多做一些修改。情节越来越复杂。如果我在运行test.update(b)之前再插入一个命令:test.update([]),那么布尔行为会以上推为objects的数字为代价。这也适用于DSM的简化示例。在

基于panda's source code,类似reindex的方法创建了一个dtype object的数据帧,而类似reindex的方法b创建了一个dtype float64的数据帧。由于object更为通用,因此后续的操作将使用bool。不幸的是,在数值列上运行np.log将失败,并返回AttributeError。在


Tags: columns方法intestfalsetrue示例dataframe
2条回答

这是一个错误,更新不应触及未指定的列,已在此处修复https://github.com/pydata/pandas/pull/3021

在更新之前,日期框b由{a1}填充,因此b变成

In [5]: b.reindex_like(a)
Out[5]: 
    a   b  isBool  isBool2
0  45  45     NaN      NaN
1 NaN NaN     NaN      NaN

然后使用numpy.where更新数据帧。在

不幸的是,对于numpy.where,如果两个数据具有不同的类型,则会使用更通用的类型。例如

^{pr2}$

由于numpy中的NaN是浮动类型,它也将返回一个浮动类型。在

In [22]: np.where(True, [True], [np.nan])
Out[22]: array([ 1.])

因此,在更新之后,“isBool”和“isBool2”列将变为浮动类型。在

我在the issue tracker for pandas上添加了此问题

相关问题 更多 >