2016-12-07 11 views
0

私はインクリメンタルに行を追加したいpandasデータフレームを持っています。私の問題は、値を出そうとすると型が失われるということです。これは、(intfloatになってきては、まだ悪いことであるが、少なくとも、プログラムの残りの部分はまだだけ少なく効率的に、実行することができます)'object'なっ​​に特に迷惑です:保存タイプの間にPandas Dataframeの行を追加する

data1 = pd.DataFrame() 
data1['foo'] = 5 
print("*\n",data1.dtypes) 
data2 =pd.DataFrame() 
data2['bar'] = True 
print("**\n",data2.dtypes) 
data3 = pd.concat([data1, data2]) 
print("***\n",data3.dtypes) 
data4 = data1.append(data2) 
print("****\n",data4.dtypes) 

* 
foo int64 
dtype: object 
** 
bar bool 
dtype: object 
*** 
bar  object 
foo float64 
dtype: object 
**** 
bar  object # <-- bool type becomes object 
foo float64 
dtype: object 

あなたは防ぐためにどのようなアイデアを持っていますかそれ?

答えて

1

をソリューション:

列のタイプはどちらか(np.nanで表現されている欠損値の表現を可能にするために変更されるため、その行は、追加されるデータフレームと比較していくつかの列を追加または欠落します)。

経験的に、この方法でタイプを変更します不足している情報を誘導する新しい行連結/追記:

  • int64 - 新しいを設定するために辞書を使用している場合>float64 - >float64
  • boolをライン
  • bool - >object私は新しい行を設定する
0

あなたの質問には、行と列が混在しています。 パンダでは、各列に型があり、各行に各列の型が割り当てられます。

あなたがdata1['foo'] = [some values]を行うと、あなたが、あなたの列の別の名前を持つ2つのデータフレーム、追加するときに、新しい を定義し、このフレームの最後に他の

追加の行を返します、新しいオブジェクト。 このフレームにない列は新しい列として追加されます。列データ・タイプを維持

here参照)concatは、データフレームの列スタックを実行使用一方

、。

最後に、列の割り当てに角括弧を使用する必要があることに注意してください。代わりに

data1['foo'] = 5 

EDITのすなわち

data1['foo'] = [5] 

df = pd.DataFrame() # Creating a DF 
df['a'] = [1,2,3] # Adding a column of integers 
df['b'] = [True, False, True] # Adding a column of Boolean 
print df['b'].dtype 

>bool 

私たちが実際にCOLことを参照してください。コメントの精神では、私はあなたの意思に従うことをしようと小さな実験を行いました'b'はブールです。部分データを持つ行を追加

df = df.append({'a':1}, ignore_index=True) 
print df['b'].dtype 

>float64 

今COL 'b' はNaNのタイプをサポートする、のfloat64に変化しました。これは知られていないナンバーですです。

最終、とdf結果印刷:問題へ

print df 

    a b 
0 1.0 1.0 
1 2.0 0.0 
2 3.0 1.0 
3 1.0 NaN 
+0

をデータフレームを使用している場合ここに列と行の間にミックスがあるとは思わないでください。目的は、おそらく異なる列セットを含む新しい行を追加することです。列がデータフレームの1つに存在しないとき、技術的にその包含が手つかず(欠損値のために実行されていない)ため、追加/連結の後でその型を把握したいと思います。私の推測では、空の値は、デフォルトでは 'int64'や 'bool'には存在しない' np.nan'(正解)であるため、カラムはその型を切り替えて既存のデータと 'np.nan ' – amougel

+0

私はあなたのことをよく理解していますが、完全には理解していません。コメント内の擬似コードで質問を更新できますか?私。それぞれのステップで、あなたがしようとしていることを正確に説明し、何が起こると思いますか。 – yuval

+0

あなたのコメントに続いて、私は追加情報で私の答えを編集しました。 – yuval

関連する問題