[英]Put WHERE clause on Pandas Merge
我有兩個pandas數據框,我試圖在三個不同的鍵上合並在一起......有點兒。 每個數據框都有一個性別列,以及一個country_destination列,我想要進行外部聯接。 一個數據框有一個age_bucket列,它是一個表示年齡范圍的字符串,例如45-49,50-54,55-59,我已經使用pandas apply方法將其轉換為另一列中的列表。 我的問題是,當您在多個鍵上的兩個數據框之間進行連接時,您是否也可以在某處執行where語句,以便能夠連接不共享相同精確數據類型的列? 例如,我可以說“在性別上加入這些表格,以及用戶年齡在age_gender的age_list列的列表值中的country_destination列”
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.columns
Index(['age_bucket', 'country_destination', 'gender',
'population_in_thousands', 'year', 'age_list'],
dtype='object')
我認為您需要按age_list
列中的值展開行,然后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'])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.