2017-05-19 5 views
1

Pandas newbie。Pandasを使ってMySQL-DBに部分テーブルをロードして保存する方法

SQLテーブルは3列(IDが主キーである)で構成されている:

query = "SELECT * FROM `TABLE_NAME` WHERE (`VALUE2` IS NULL)" 
engine = create_engine("mysql://user:[email protected]/db" 
df = pd.read_sql(query, con=engine) 
engine.dispose() 

:私はVALUE2は(なし)あるすべての行を読み込むパンダと

> ID VALUE1 VALUE2 
> 1  11  28 
> 2  21  (None) 
> 3  31  56 
> 4  41  (None) 

今まではすべてが大丈夫でした。

ロード後、失われたVALUE2はいくつかのルールに従って計算されます。

PROBLEM

私は

df.to_sql(TABLE_NAME, con=engine, if_exists="replace", index=False) 

でデータベースを更新した場合のデータフレームにロードされていなかったすべての元の線が失われています。

> ID VALUE1 VALUE2 
> 2  21  103 
> 4  41  72 

があります元の行をそのまま残して更新する方法はありますか?

私はこれを取得する:

> ID VALUE1 VALUE2 
> 1  11  28 
> 2  21  103 
> 3  31  56 
> 4  41  72 

それは書き換えの代わりに、更新された全テーブルのように見える...

テーブル全体をロードすることが非常に非効率的になるだけで更新します少数の行。それは事実上問題を解決するだろうが、それは受け入れられない。

「なぜ」についてのご意見はありますか?

答えて

1

最高の2つの世界を混在させる場合です。現時点であなたがやっていることをやりますが、別のテーブルを使用してください。これは本質的には一時的なテーブルですが、AFAIKのパンダはそれらをサポートしていませんので、後でドロップしてみましょう。

df.to_sql(tmp_table_name, con=engine, if_exists="replace", index=False) 

その後、我々は、これは通常、高速動作になり

INSERT INTO TABLE_NAME (SELECT * FROM tmp_table) ON DUPLICATE KEY UPDATE a = VALUES(a), b=VALUES(b) .... 

INSERT ON DUPLICATE KEY構文を使用しています。

+0

何かのために二重ステップを通過する必要があるので、「シンプル」なのは少し奇妙です。パンダは仕事だけでとても近いです... ありがとう! –

+0

助けてくれてうれしい – e4c5

2

オプションif_exists="replace"を使用しています。パンダのドキュメント(私の太字化)から

は交換してください:表が存在する場合は、それをドロップそれを再作成し、データを挿入

これは、あなたが求めていることを正確に示しています。あなたは代わりにif_exists="append"で遊んでみることができますが、それでもあなたが探している振る舞いを与えないかもしれません。

また、MySQLdbを使用して直接テーブルと対話し、UPDATEを使用することもできます。

+0

「置き換え」と誤解されているように見えます。ドキュメントを見落とし、テーブル全体ではなく単一のレコードを参照していると思いました。ありがとうございました。 –

関連する問題