1

提供された引数がブール値の列を提供していない場合、保存された値がsにアップキャストされるという奇妙な問題 (combine_firstまたは意図された?) に遭遇しました。updateboolfloat64

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、他の列を台無しにしないと思います。


編集:もう少しいじり始めました。プロットが厚くなります。もう 1 つコマンドを挿入すると、test.update([])を実行する前にtest.update(b)、ブール値の動作は としてアップキャストされた数値を犠牲にして機能しobjectsます。これは、DSM の簡略化された例にも当てはまります。

panda のソース コードに基づくと、reindex_like メソッドは dtype の DataFrame を作成し、reindex_like メソッドは dtype の DataFrame をobject作成bしているように見えfloat64ます。はより一般的であるためobject、後続の操作はブール値で機能します。残念ながらnp.log、数値列で実行すると、AttributeError.

4

2 に答える 2

3

更新する前に、日付フレームは reindex_linkによってb満たされているため、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.where2 つのデータが異なる型を持つ場合、より一般的な方が使用されることです。例えば

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

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

NaNinは浮動小数点型なので、numpy浮動小数点型も返します。

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

したがって、更新後、「isBool」および「isBool2」列は浮動型になります。

この問題をパンダの問題トラッカーに追加しました

于 2013-03-12T04:23:59.757 に答える
2

これはバグです。更新は不特定の列に影響を与えるべきではありません。ここで修正されましたhttps://github.com/pydata/pandas/pull/3021

于 2013-03-12T14:50:36.767 に答える