2017-06-15 3 views
2

Ich habe zwei Pandas Datenrahmen, die ich zusammen auf drei verschiedene Schlüssel zusammenführen möchte ... Art von. Jeder Datenrahmen hat eine geschlechtsspezifische Spalte und eine country_destination-Spalte, in der ich den äußeren Join ausführen möchte. Ein Datenrahmen hat eine age_bucket-Spalte, die eine Zeichenfolge ist, die den Altersbereich z.B. 45-49, 50-54, 55-59, die ich mit der pandas apply-Methode in eine Liste in einer anderen Spalte gewandelt habe. Meine Frage ist, wenn Sie eine Verbindung zwischen zwei Datenrahmen auf mehreren Schlüsseln machen, können Sie auch eine where-Anweisung irgendwo tun, um in der Lage zu sein, auf Spalten, die nicht die gleichen genauen Datentypen teilen? Zum Beispiel könnte ich sagen "diese Tabellen zu Gender Join und country_destination Spalten, in denen das Alter eines Benutzers in der Liste Wert von age_gender des age_list Spalte"Put WHERE Klausel auf Pandas Merge

age_gender = pd.read_csv('data/age_gender_bkts.csv') 
users = pd.read_csv('data/train_users_2.csv') 

def getAgeList(row): 
    clean_age = row['age_bucket'].replace('+', '') 
    min_max = clean_age.split('-') 

    if len(min_max) > 1: 
     min_max = list(range(int(min_max[0]), int(min_max[1]) + 1)) 
    return min_max 

age_gender['age_list'] = age_gender.apply(lambda x: getAgeList(x), axis=1) 

combined_df = pd.merge(users, age_gender, on=['country_destination', 'gender']) 

user.columns

Index(['id', 'date_account_created', 'timestamp_first_active', 
     'date_first_booking', 'gender', 'age', 'signup_method', 'signup_flow', 
     'language', 'affiliate_channel', 'affiliate_provider', 
     'first_affiliate_tracked', 'signup_app', 'first_device_type', 
     'first_browser', 'country_destination', 'lat_destination', 
     'lng_destination', 'distance_km', 'destination_km2', 
     'destination_language ', 'language_levenshtein_distance'], 
     dtype='object') 

age_gender.

Spalten
Index(['age_bucket', 'country_destination', 'gender', 
     'population_in_thousands', 'year', 'age_list'], 
     dtype='object') 

Datenrahmen Proben enter image description hereenter image description here

+1

Warum Sie den Datenrahmen vor der Zusammenführung nicht filtern? –

+0

Können Sie einige Datenproben hinzufügen, 2-4 Zeilen für jeden Datenrahmen mit der gewünschten Ausgabe? Ich denke [minimales, vollständiges und überprüfbares Beispiel] (http://stackoverflow.com/help/mcve). Vielen Dank. – jezrael

+0

Auch gibt es viele Spalten, es scheint 2 - 3 Spalten in jedem Datenframe ist nur in Proben notwendig. – jezrael

Antwort

2

Ich glaube, Sie Reihen von Werten in age_list Spalte erweitern müssen und dann merge:

#get lengths of each list 
l = age_gender['age_list'].str.len() 
#get all columns without age_list 
cols = age_gender.columns.difference(['age_list']) 
#repeat values by lengths to new DataFrame 
df = pd.DataFrame({col: np.repeat(age_gender[col].values, l) for col in cols}) 
#flattening lists, necessary convert to int, because merge not match 
df['age'] = np.concatenate(age_gender['age_list'].values).astype(int) 

#inner merge is default, so how='inner' is omit 
df1 = pd.merge(df, users, on=['age', 'country_destination']) 
+0

Meister! Ich habe das Gefühl, dass es eine eingebaute Möglichkeit geben sollte, dies in pandas.merge zu tun, aber das bringt mir immer noch das, was ich brauche:). Danke, ich werde nach Wegen suchen müssen, um Pandas-Datenrahmen in Text zu kopieren, damit ich keine Bilder von ihnen posten muss. – JBT

+0

Danke. Ich versuche ein bisschen Lösung zu beschreiben, gib mir eine Sekunde. – jezrael

+0

Ah die Kraft von Python. Danke für die Beschreibung jezrael! es ist sehr geschätzt. – JBT