2017-08-31 13 views
0

私はpandasに多くのSQLを実行しています。私は以下の課題に取り組んでいます。pandasデータフレームを更新するSQL値

私は私がやりたい何

UserID, AccountNo, AccountName 
123, 12345,  'Some name' 
... 

のように見えるのデータフレームは、各口座番号のために、私は、MySQLデータベースから取得された総収入と呼ばれる列を追加したいと思いますされてい、ソム私は何かのように、

for accountno in df['AccountNo']: 
    df1 = pd.read_sql(('select sum(VBRK_NETWR) as sum from sapdata2016.orders where VBAK_BSARK="ZEDI" and VBRK_KUNAG = %s;') % accountno, conn) 

のことを考えていると私は、このような

UserID, AccountNo, AccountName, TotalRevenue 
123, 12345,  'Some name', df1 
... 
そのデータフレームを拡張する必要があります私はこれまで持っている210

コード

sets3 = [] 
i=0 
for accountno in df5['kna1_kunnr']: 
    df1 = pd.read_sql(('select sum(VBRK_NETWR) as sum from sapdata2016.orders where VBAK_BSARK="ZEDI" and VBRK_KUNAG = %s;') % accountno, conn) 
    df2 = pd.DataFrame([(df5['userid'][i], df5['kna1_kunnr'][i], accountno, df5['kna1_name1'][i], df1['sum'][0])], columns=['User ID', 'AccountNo', 'tjeck', 'AccountName', 'Revenue']) 
    sets3.append(df2) 
    i += 1 

df6 = pd.concat(sets3) 

このアイデア/コードはかなりではない(と動作していないがのGetItemエラーをキャスト)、と私はそれを行うには良い/よりよい方法がありますかしら、 何か案は?

+0

データが異なるデータベースやテーブルのロットから来て、それ私がやっている非常にカットアンドペーストの手順です。 –

+0

私はあなたがテーブルのすべてを個々のデータフレームに読み込んで、それらを適切なキーで一緒に結合してから要約を行うべきだと思います。私たちに、テーブルの代表的な選択肢から5 - 10行を表示してください。 –

+0

@PaulH - またはその逆に、すべてのデータをDBに書き込んで、MySQLでクエリを実行してください。 – Parfait

答えて

1

パンダのデータを一時テーブルとしてMySQLにエクスポートし、パンダのデータを集計するSQLクエリとTotalRevenueの集約クエリを実行することを検討してください。次に、結果セットをパンダのデータフレームに読み込みます。このアプローチは、ループを回避します。逆は2匹のパンダの既存のデータフレームのデータフレームとグループ化された集計クエリ結果セットにマージし、同様に真であるもちろん

from sqlalchemy import create_engine 
... 

# SQL ALCHEMY CONNECTION (PREFERRED OVER RAW CONNECTION) 
engine = create_engine('mysql://user:[email protected]/database') 
# engine = create_engine("mysql+pymysql://user:[email protected]:port/database") # load pymysql 

df1.to_sql("mypandastemptable", con=engine, if_exists='replace') 

sql = """SELECT t.UserID, t.AccountNo, t.AccountName, agg.TotalRevenue 
     FROM mypandastemptable t 
     LEFT JOIN 
      (SELECT VBRK_KUNAG as AccountNo 
        SUM(VBRK_NETWR) as TotalRevenue 
      FROM sapdata2016.orders 
      WHERE VBAK_BSARK='ZEDI' 
      GROUP BY VBRK_KUNAG) agg 
     ON t.AccountNo = agg.AccountNo) 
""" 

newdf = pd.read_sql(sql, con=engine) 

sql = """SELECT VBRK_KUNAG as AccountNo 
       SUM(VBRK_NETWR) as TotalRevenue 
     FROM sapdata2016.orders 
     WHERE VBAK_BSARK='ZEDI' 
     GROUP BY VBRK_KUNAG 
""" 

df2 = pd.read_sql(sql, con=engine) 

newdf = df1.merge(df2, on='AccountNo', how='left') 
+0

後者は私が探していたもののようです!ありがとうたくさん - 迅速なフォローアップ、私は動作するようにsqlalchemyを得ることができなかったので、私は未加工の接続を使用しています。しかし、私はこの例で私は私に得るつもりです:-) –

+0

それを得ました。また、 'pymysql'モジュールとインターフェースするコメント付きのslqalchemy接続に注意してください。 – Parfait

関連する問題