2016-10-11 2 views
2

ich zwei Datenrahmen anschließen möchten:replizieren IFERROR und vlookup in einem Pandas kommen

df1 = pd.DataFrame({'Banner': {0: 'banner1', 1: 'banner2', 2: 'banner3'}, 
        'Campaign': {0: 'campaign1', 1: 'campaign2', 2: '12345'}, 
        'Country ': {0: 'de', 1: 'it', 2: 'de'}, 
        'Date': {0: '1/1/2016', 1: '2/1/2016', 2: '1/1/2016'}, 
        'Value_1': {0: 10, 1: 5, 2: 20}}) 

df2 = pd.DataFrame({'Banner': {0: 'banner1', 1: 'banner2', 2: 'banner3', 3: 'banner4', 4: 'banner5'}, 
        'Campaign': {0: 'campaign1',1: 'campaign2', 2: 'none',3: 'campaign4',4: 'campaign5'}, 
        'Country ': {0: 'de', 1: 'it', 2: 'de', 3: 'en', 4: 'en'}, 
        'Date': {0: '1/1/2016', 1: '2/1/2016', 2: '1/1/2016', 3: '3/1/2016', 4: '4/1/2016'}, 
        'Value_2': {0: 5, 1: 10, 2: 15, 3: 20, 4: 25},    
        'id_campaign': {0: 'none', 1: 'none', 2: '12345', 3: 'none', 4: 'none'}}) 

bearbeiten: lassen Sie uns auch die Möglichkeit, sich vorstellen:

df1 = pd.DataFrame({'Banner': {0: 'banner1', 1: 'banner2', 2: 'banner3'}, 
       'Campaign': {0: 'campaign1', 1: 'campaign2', 2: '12345'}, 
       'Date': {0: '1/1/2016', 1: '2/1/2016', 2: '1/1/2016'}, 
       'Value_1': {0: 10, 1: 5, 2: 20}}) 

Ich habe DF2 und DF1 beitreten auf den Tasten:

  • Datum
  • Kampagne
  • Banner

Das hier Problem ist, dass, wenn das Spiel unter dem Schlüssel „Kampagne“ nicht gefunden wird, soll der Schlüssel Feld „id_campaign“ umgeschaltet wird.

Ich mag diesen Datenrahmen erhalten:

df_joined = pd.DataFrame({'Banner': {0: 'banner1', 1: 'banner2', 2: 'banner3', 3: 'banner4', 4: 'banner5'}, 
         'Campaign': {0: 'campaign1', 1: 'campaign2', 2: 'none', 3: 'campaign4', 4: 'campaign5'}, 
         'Country ': {0: 'de', 1: 'it', 2: 'de', 3: 'en', 4: 'en'}, 
         'Date': {0: '1/1/2016', 1: '2/1/2016', 2: '1/1/2016', 3: '3/1/2016', 4: '4/1/2016'}, 
         'Value_1': {0: 10, 1: 5, 2: 20, 3: 0, 4: 0}, 
         'Value_2': {0: 5, 1: 10, 2: 15, 3: 20, 4: 25}, 
         'id_campaign': {0: 'none', 1: 'none', 2: '12345', 3: 'none', 4: 'none'}}) 

jede Hilfe ist wirklich zu schätzen.

Antwort

0

können Sie doppelt verwenden merge von Tasten 3 und 2 und dann Werte übereinstimmen füllen nicht durch combine_first aus Spalte Value_1 von df4:

df3 = pd.merge(df2, df1.drop('Country', axis=1), on=['Date','Campaign','Banner'], how='left') 
df4 = pd.merge(df2, df1, on=['Date','Banner'], how='left') 

print (df3) 
    Banner Campaign Country  Date Value_2 id_campaign Value_1 
0 banner1 campaign1  de 1/1/2016  5  none  10.0 
1 banner2 campaign2  it 2/1/2016  10  none  5.0 
2 banner3  none  de 1/1/2016  15  12345  NaN 
3 banner4 campaign4  en 3/1/2016  20  none  NaN 
4 banner5 campaign5  en 4/1/2016  25  none  NaN 

print (df4['Value_1']) 
0 10.0 
1  5.0 
2 20.0 
3  NaN 
4  NaN 
Name: Value_1, dtype: float64 

df3['Value_1'] = df3['Value_1'].combine_first(df4['Value_1']).fillna(0).astype(int) 
print (df3) 
    Banner Campaign Country  Date Value_2 id_campaign Value_1 
0 banner1 campaign1  de 1/1/2016  5  none  10 
1 banner2 campaign2  it 2/1/2016  10  none  5 
2 banner3  none  de 1/1/2016  15  12345  20 
3 banner4 campaign4  en 3/1/2016  20  none  0 
4 banner5 campaign5  en 4/1/2016  25  none  0 
+0

Es funktioniert einwandfrei: Ich brauche nur eine zusätzliche Klärung besser die Verbindung zu verstehen. Wenn der df1 nicht die Spalte "Land" enthält, würde ich würde ich das gleiche df3 bekommen? Ich werde meine Frage bearbeiten. – xxxvinxxx

+0

Ich denke, beide "df1" sind gleich. Vielleicht eine falsche Kopie. – jezrael

+0

Ok, versuche ich besser meine Lösung zu erklären: Also Idee ist sehr einfach - wenn Innenverbindung verwenden, müssen alle Schlüssel übereinstimmen. Also wenn 3 Schlüssel 'on = ['Datum', 'Kampagne', 'Banner']' und einige nicht übereinstimmen, wird weggelassen. und problematischer Schlüssel ist in der Spalte 'Kampagne'. also erstelle ich eine weitere 'merge', bei der dieser problematische Schlüssel weggelassen wird und du eine weitere Ausgabe' df4' bekommst. Aber Sie brauchen nur die Spalte 'Value_1' und müssen alle Werte von' df3 ['Value_1'] 'wo' NaN' (nicht übereinstimmen) ersetzen. Also addieren Sie den Wert "20" und die Werte in der ersten und zweiten Zeile werden nicht ersetzt. Wenn meine Erklärung nicht klar ist (kann ich oft nicht gut erklären), gib mir eine Frage. Danke – jezrael