2017-11-30 6 views
1

건물 주소가 포함 된 두 개의 서로 다른 원본에서 두 개의 데이터 프레임이 있는데이를 병합하고 싶습니다. 내가 가지고있는 문제는 주소가 정확히 두 세트에서 같은 방식으로 기록되지 않았다는 것입니다. 특히 거리의 방향 ('N', 'E', 'S', 'W')이 있습니다.팬더가 두 번째 선택 열이있는 열에 병합

한 세트의 일부 주소는 방향을 가지고 있기 때문에 방향을 병합 열로 사용하면 일부 일치하는 주소가 병합되지 않습니다 (예 : '123 Main St'in one and '123 N Main St' 다른 쪽에서). 일부 건물은 방향을 제외하고는 동일한 주소 (예 : '456 N Other Ave'및 '456 S Other Ave')가 있으므로 방향을 모두 무시하고 싶지는 않지만 거리의 방향을 다음과 같이 사용하고 싶습니다. 중복 주소가있는 경우에만 사용되지만 다르게 무시되는 보조 병합 열입니다. 이것을 할 수있는 방법이 있습니까? 나는이 병합이

두 열은 full_add 각각 '123 Main St''N' 같은 항목이 Dir 있습니다. 이것은 단지 다음 "full_add"에 가입 null이 아닌 같은 비 매칭 디렉터리의 같은 원하지 않는 레코드를 필터링하는 것입니다 할

df1 = pd.DataFrame({'full_add': ['123 Main St', '456 Other Ave', '456 Other Ave'], 'Dir': ['N', 'N', 'S'], 'left_val': [100, 200, 300]}) 
df2 = pd.DataFrame({'full_add': ['123 Main St', '456 Other Ave', '456 Other Ave'], 'Dir': [np.nan, 'N', 'S'], 'right_val': [1000, 2000, 3000]}) 
merged = pd.DataFrame({'full_add': ['123 Main St', '456 Other Ave', '456 Other Ave'], 'Dir': ['N', 'N', 'S'], 'left_val': [100, 200, 300], 'right_val': [1000, 2000, 3000]}) 

답변

1

한 가지 방법은 다음과 같습니다

은 예입니다.

df_out = df1.merge(df2, on='full_add') 

mask = ((df_out.Dir_x.isnull()) | (df_out.Dir_y.isnull()) | (df_out.Dir_x == df_out.Dir_y)) 

df_out[mask] 

출력 :

Dir_x  full_add left_val Dir_y right_val 
0  N 123 Main St  100 NaN  1000 
1  N 456 Other Ave  200  N  2000 
4  S 456 Other Ave  300  S  3000 
+0

아, 완벽한, 나는 그와 같은 방향으로 향하고 있었다, 그러나 이것은 훨씬 간단합니다! –

+0

다행, 도울 수 있어요. 고맙습니다. –