2016-10-29 3 views
2

У меня 2 dataframes в питона пандPython Панды - Слияние между условием

Dataframe 1

User_id zipcode 

1  12345 

2  23456 

3  34567 

Dataframe 2

ZipCodeLowerBound ZipCodeUpperBound Region 

10000    19999    1 

20000    29999    2 

30000    39999    3 

Как можно отобразить в Регионе dataframe 1 с состояние if(df1.zipcode>=df2.ZipCodeLowerBound and df1.zipcode<=df2.ZipCodeUpperBound) использование pandas merge

ответ

0

Это дает столбец для региона и маска каждого почтового индекса, принадлежащая этот регион или нет:

df2 = df2.set_index('Region') 
mask = df2.apply(lambda r: df1.zipcode.between(r['ZipCodeLowerBound'], 
               r['ZipCodeUpperBound']), 
       axis=1).T 
mask 
Out[103]: 
Region  1  2  3 
0  True False False 
1  False True False 
2  False False True 

Затем вы можете использовать эту матрицу против своих собственных имен столбцов, чтобы применить его в качестве маски и найти обратно регион:

mask.dot(mask.columns) 
Out[110]: 
0 1 
1 2 
2 3 
dtype: int64 
0
import pandas as pd 

df1 = pd.DataFrame({'User_id': [1,2,3], 
        'zipcode':[12345,23456,34567]}) 
df2 = pd.DataFrame({'ZipCodeLowerBound': [10000,20000,30000], 
        'ZipCodeUpperBound': [19999,29999,39999], 
        'Region': [1,2,3]}) 

region = [] 
for i in range(len(df1.zipcode)): 
    region.append(int(df2[(df2.ZipCodeLowerBound <= df1.zipcode[i]) & (df2.ZipCodeUpperBound >= df1.zipcode[i])]['Region'])) 
df1['Region'] = region 

print(df1) 

Выход:

User_id zipcode Region 
0  1 12345  1 
1  2 23456  2 
2  3 34567  3