2017-02-27 3 views
0

Die SQL-Operation ist als unten hinzu:neue Spalte basierte ähnlich eine SQL-Operation in Python Pandas

UPDATE table_A s SET t.stat_fips=s.stat_fips 
    WHERE t.stat_code=s.stat_code; 

Wenn eine ähnliche Operation auf csv getan werden muss, einen Vergleich einen Wert von csv B Wie dies zu erreichen, in Python?

Daten: vermuten lässt -

CSV A 
col1 stat_code name 
abc  WY   ABC 
def  NA   DEF 
ghi  AZ   GHI 

CSV B 
stat_fips stat_code 
2234  WY 
4344  NA 
4588  AZ 


Resulting CSV : 

col1 stat_code name stat_fips 
abc  WY  ABC  2234 
def  NA  DEF  4344 
ghi  AZ  GHI  4588

den versuchten Code Hinzufügen bisher: (. Nicht wirklich sicher auf Pandas noch die Grundlagen zu lernen)

df = pd.read_csv('fin.csv',sep='\t', quotechar="'") 
    df = df.set_index('col1').stack(dropna=False).reset_index 
    df1['stat_fips'] = df1['stat_code'] 
    print df1 

+0

df = pd.read_csv ('fin.csv' , sep = '\ t', quotechar = "'") df = df.set_index (' col1 '). stack (dropna = Falsch) .reset_index() df1 [' stat_fips '] = df1 [' stat_code '] Drucken df – Viv

Antwort

2

Ihre Beispieldaten zu urteilen, sieht es wie Druckvorgang auf Ihrer stat_code Säule:

import pandas as pd 

df_a = pd.DataFrame([["abc", "WY", "ABC"], ["def", "NA", "DEF"]], columns= ["col1", "stat_code", "name"]) 
df_b = pd.DataFrame([[2234, "WY"], [4344, "NA"]], columns=["stat_fips", "stat_code"]) 

merged_df = pd.merge(df_a, df_b, on="stat_code", how="left") 
print(merged_df) 

    col1 stat_code name stat_fips 
0 abc  WY ABC  2234 
1 def  NA DEF  4344 
+0

Wie stellen Sie sicher, dass stat_fips ein int anstelle von string bleibt? – Viv

+0

Die Zusammenführung wird Ihre 'stat_fips' nicht von int in string ändern, so dass Sie sich darüber keine Gedanken machen müssen. Sie könnten Strings für 'stat_fips' bereits vor der Zusammenführung haben. – pansen

+0

Es zeigt, wie ein Str-Typ obwohl! .. Ich muss eine Int-Operation auf die resultierende neue Spalte in der CSV und es schlägt fehl. – Viv

2

Es scheint, Sie benötigt map von dictd:

d = df2.set_index('stat_code')['stat_fips'].to_dict() 
df1['stat_fips'] = df1['stat_code'].map(d) 
print (df1) 

    col1 stat_code name stat_fips 
0 abc  WY ABC  2234 
1 def  NaN DEF  4344 
2 ghi  AZ GHI  4588 

Oder merge mit LEFT JOIN:

df3 = pd.merge(df1, df2, on='stat_code', how='left') 
print (df3) 

    col1 stat_code name stat_fips 
0 abc  WY ABC  2234 
1 def  NaN DEF  4344 
2 ghi  AZ GHI  4588 
+0

wie Sie die letzte c ändern olumn Typ zu int anstelle von String? – Viv

+0

Verwenden Sie 'df3. stat_fips = df3. stat_fips.astype (int) ' – jezrael

+0

ValueError: Kann NA nicht in Integer konvertieren, zuvor Befehl, wenn ich versuche, den Typ dieser Spalte zu sehen, ist es str. Ich bin mir ziemlich sicher – Viv

Verwandte Themen