1

如果提供的参数不提供布尔列,我遇到了一个奇怪的问题(或有意的?)在哪里combine_firstupdate正在导致存储的值bool向上转换为s 。float64

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([])在运行之前test.update(b),布尔行为会以数字向上转换为objects. 这也适用于 DSM 的简化示例。

根据panda 的源代码,看起来 reindex_like 方法正在创建一个 dtype 的 DataFrame object,而 reindex_likeb创建一个 dtype 的 DataFrame float64。由于object更通用,后续操作使用布尔值。不幸的是np.log,在数值列上运行将失败,并显示AttributeError.

4

2 回答 2

3

在更新之前,日期帧breindex_link填充,因此 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,如果两个数据具有不同的类型,则会使用更通用的一个。例如

In [20]: np.where(True, [True], [0])
Out[20]: array([1])

In [21]: np.where(True, [True], [1.0])
Out[21]: array([ 1.])

由于NaNinnumpy是浮动类型,它也会返回一个浮动类型。

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

因此,更新后,您的 'isBool' 和 'isBool2' 列变为浮动类型。

我已经在pandas 的问题跟踪器上添加了这个问题

于 2013-03-12T04:23:59.757 回答
2

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

于 2013-03-12T14:50:36.767 回答