2017-08-31 5 views
0

Ich mache eine Menge sql zu Pandas und ich habe in der folgenden Herausforderung eingelaufen.SQL-Werte zum Aktualisieren Pandas Dataframe

ich einen Datenrahmen haben, sieht das wie

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

Was ich für jede Kontonummer tun möchte, so würde Ich mag eine Spalte Gesamtumsatz genannt hinzuzufügen, die aus einer MySQL-Datenbank erhalten wird, som ich denke an so etwas wie,

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) 

Und ich brauche die den Datenrahmen, so dass

UserID, AccountNo, AccountName, TotalRevenue 
123, 12345,  'Some name', df1 
... 
erweitern 210

Der Code, den ich bisher (und nicht funktioniert, wirft einen getitem Fehler)

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) 

Diese Idee/code ist nicht schön, und ich frage mich, ob es eine bessere/schönere Art und Weise, es zu tun , irgendwelche Ideen?

+0

Die Daten stammen aus vielen verschiedenen Datenbanken und Tabellen, es ist sehr viel Schnitt und Paste Verfahren, die ich mache. –

+0

dann denke ich, dass Sie alle Ihre Tabellen in einzelne Datenrahmen lesen sollten, verbinden Sie sie auf entsprechenden Schlüsseln zusammen, und führen Sie dann Ihre Zusammenfassung. Zeige uns 5 - 10 Zeilen aus einer repräsentativen Auswahl deiner Tabellen –

+0

@PaulH - oder umgekehrt, schreibe alle Daten in die DB und starte Abfragen in MySQL – Parfait

Antwort

1

Ziehen Sie in Betracht, Pandas-Daten als temporäre Tabelle in MySQL zu exportieren und dann eine SQL-Abfrage auszuführen, die Ihre Pandas-Daten und eine zusammengefasste Abfrage für TotalRevenue verbindet. Dann lese resultset in Pandas Dataframe. Dieser Ansatz vermeidet jegliche Schleifenbildung.

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) 

Natürlich das Gegenteil auch wahr ist, auf zwei Pandas Datenrahmen von bestehenden Datenrahmen verschmelzen und die gruppierte Aggregatabfrage resultset:

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

Letzteres scheint das Ding zu sein, nach dem ich gesucht habe! Vielen Dank - schnelle Folge, ich habe die rohe Verbindung verwendet, weil ich nicht konnte, dass sqlalchemy funktioniert. Aber ich hoffe, mit diesem Beispiel werde ich ich zu bekommen :-) –

+0

Got it. Und notieren Sie die auskommentierte Slqalchemy-Verbindung, die mit dem 'pymysql'-Modul verbunden ist. – Parfait