2017-05-11 3 views
2

검색 중이며이 질문에 대한 답을 찾지 못했습니다. OR 논리를 사용하여 pandas 데이터 프레임을 병합 할 수 있습니까? 기본적으로 "where t1.A = t2.A OR t1.A = t2.B"를 사용하여 SQL 병합에 해당합니다.Python pandas가 OR 논리와 병합

하나의 데이터베이스에서 정보를 데이터 프레임 (df1)으로 가져 오는 상황이 있는데 다른 데이터베이스의 정보와 병합해야합니다. 다른 데이터 프레임 (df2)을 가져 와서 단일 열을 기반으로 병합합니다 (col1). 이들이 일치 할 때 항상 동일한 값을 사용하면 매우 간단합니다. 내가 가진 상황은 때로는 일치하고 때로는 동의어를 사용한다는 것입니다. 세 번째 데이터 프레임 (df3)으로 가져올 수있는이 데이터 엔터티 (col1 및 col1_alias)의 동의어를 조회 할 수있는 테이블이있는 세 번째 데이터베이스가 있습니다. 내가 원하는 것은 df1에서 필요한 열과 df2에서 필요한 열을 병합하는 것입니다.

df1.col1 및 df2.col1 일치,이 작동 할 경우, 위의 언급 한 바와 같이

...

df = df1.merge(df2, on='col1', how='left') 

그러나 그들은 항상 같은 값이없는 때로는 동의어가 있습니다. 나는 df3.col1이 df1.col1에 있었거나 df3.col1_alias가 df1.col1에있을 때를 기반으로 df3을 생성하려고 생각했습니다. 그런 다음 df3.col1 및 df3.col1_alias (list1)에서 하나의 값 목록을 만들고 list1에서 df2.col1을 기반으로 df2를 선택합니다. 이것은 내가 필요로하는 df2의 행을 줄 것이지만, 여전히 적절한 행과 일치하는 df1과 df2를 병합하지 않을 것입니다. 는 OR 옵션을 병합이, 나는이를 통해 단계로 작동 할 수 있는지 생각하지만, 다음의 모든 구문 오류가 발생했습니다 :

df = df1.merge((df3, left_on='col1', right_on='col1', how='left')|(df3, left_on='col1', right_on='col1_alias', how='left')) 

df = df1.merge(df3, (left_on='col1', right_on='col1')|(left_on='col1', right_on='col1_alias'), how='left') 

df = df1.merge(df3, left_on='col1', right_on='col1'|right_on='col1_alias', how='left') 

및 기타 여러 가지 변형이 있습니다. df3에서 두 개의 열에있는 동의어를 사용하여 df1과 df2를 병합하는 것과 완전히 다른 방식으로 OR 병합 또는 제안을 수행하는 방법에 대한 지침이 있습니까?

답변

0
#will this work? 
df = pd.concat([df1.merge(df3, left_on='col1', right_on='col1', how='left'), df1.merge(df3, left_on='col1', right_on='col1_alias', how='left')] 
+0

그렇게하지 : 더 확장 성을 위해 그들이이 예에서 모두 같은있어 비록 그것이 하나의 열을 끌어 적합 할 수 있습니다 (다른 열을 일치) 두 병합 cols가 한 행만 일치하는 것이 필요한 경우 IIUC 이후에 concat이 _quite_ 바로 여기에 있다고 생각합니다. –

0

가 나는 두 병합으로이 작업을 수행 할 것이라고 생각 : -> D = 7보다는 B = 2 -> D = 8

당신이 볼 수 있듯이

In [11]: df = pd.DataFrame([[1, 2], [3, 4], [5, 6]], columns=["A", "B"]) 

In [12]: df2 = pd.DataFrame([[1, 7], [2, 8], [4, 9]], columns=["C", "D"]) 

In [13]: res = df.merge(df2, left_on="B", right_on="C", how="left") 

In [14]: res.update(df.merge(df2, left_on="A", right_on="C", how="left")) 

In [15]: res 
Out[15]: 
    A B C D 
0 1 2 1.0 7.0 
1 3 4 4.0 9.0 
2 5 6 NaN NaN 

이 A = 1을 선택합니다

참고 :

In [21]: res = df.merge(df2, left_on="B", right_on="C", how="left")["C"] 

In [22]: res.update(df.merge(df2, left_on="A", right_on="C", how="left")["C"]) 

In [23]: res 
Out[23]: 
0 1.0 
1 4.0 
2 NaN 
Name: C, dtype: float64 
+0

대단히 고마워요! 분명히 이것을 줄 것입니다. – stlouismv

관련 문제