2016-08-23 4 views
3

私は、combine_firstメソッドがboolとして格納された値をfloat64にアップキャストさせるという奇妙な問題に遭遇しています。 例:pandas DataFrame combine_firstメソッドは浮動小数点数でブール値を変換します

In [1]: import pandas as pd 

In [2]: df1 = pd.DataFrame({"a": [True]}) 

In [3]: df2 = pd.DataFrame({"b": ['test']}) 

In [4]: df2.combine_first(df1) 
Out[4]: 
    a  b 
0 1.0 test 

この問題は、すでに3年前以前の記事で報告されています:pandas DataFrame combine_first and update methods have strange behavior。この問題が解決されるように語ったが、私はまだ

0.18.1を組み合わせたデータフレームを取得するイベントのチェーンに沿って

+0

問題は何ですか。 – piRSquared

+0

私はcombine_firstメソッドがbool値を列 'a'に保持しないのはなぜだろうか? – RomB

答えて

4

どこかにあなたの助けをありがとうパンダの下で、この動作を持っていた、潜在的な欠損値がでなければなりませんでした対処しました。私はあなたの例に何もないことを知っています。 Noneおよびnp.nanは、intまたはboolではありません。したがって、boolNoneまたはnp.nanを含む共通のdtypeを得るには、objectまたはfloatのいずれかとして列をキャストする必要があります。 「フロート」として、多数の操作がはるかに効率的になり、まともな選択です。明らかに常に最善の選択ではありませんが、パンダが最良のものを推測しようとする選択肢はありません。

回避:

セットアップ

df1 = pd.DataFrame({"a": [True]}) 
df2 = pd.DataFrame({"b": ['test']}) 

df3 = df2.combine_first(df1) 
df3 

enter image description here

ソリューション

dtypes = df1.dtypes.combine_first(df2.dtypes) 

for k, v in dtypes.iteritems(): 
    df3[k] = df3[k].astype(v) 

df3 

enter image description here

関連する問題