2017-11-27 2 views
0

아래 그림과 같이 팬더에는 두 개의 데이터 프레임이 있습니다. EmpID는 두 데이터 프레임의 기본 키입니다.전체 외부 조인을 사용하여 팬더에서 두 개의 데이터 프레임 결합

df_first = pd.DataFrame([[1, 'A',1000], [2, 'B',np.NaN],[3,np.NaN,3000],[4, 'D',8000],[5, 'E',6000]], columns=['EmpID', 'Name','Salary']) 
df_second = pd.DataFrame([[1, 'A','HR','Delhi'], [8, 'B','Admin','Mumbai'],[3,'C','Finance',np.NaN],[9, 'D','Ops','Banglore'],[5, 'E','Programming',np.NaN],[10, 'K','Analytics','Mumbai']], columns=['EmpID', 'Name','Department','Location']) 

나는다는 EmpID 이러한 두 dataframes에 가입 할 그래서

한 dataframe에서
  • 누락 된 데이터는 다른 경우가있는 테이블과 키 일치에서 값으로 채워질 수
    1. 와 관찰이있는 경우 새 키가 생성 된 데이터 프레임에 추가되어야합니다.

    나는 이것을 달성하기 위해 아래 코드를 사용했습니다.

    merged_df = pd.merge(df_first,df_second,how='outer',on=['EmpID']) 
    

    그러나이 코드는 내가 원하지 않는 중복 열을 제공하므로 병합을 위해 두 테이블의 고유 한 열만 사용했습니다.

    ColNames = list(df_second.columns.difference(df_first.columns)) 
    ColNames.append('EmpID') 
    merged_df = pd.merge(df_first,df_second,how='outer',on=['EmpID']) 
    

    이제 중복 열은 없지만 키가 일치하는 관측 값을 얻지는 못합니다.

    누군가가이 문제를 해결할 수 있다면 정말 감사하겠습니다.

    감사합니다, KAILASH 네기

  • 답변

    0

    당신이 열 EmpID 만든 인덱스에 의해 일치 set_indexcombine_first 필요 보인다

    df = df_first.set_index('EmpID').combine_first(df_second.set_index('EmpID')).reset_index() 
    print (df) 
        EmpID Department Location Name Salary 
    0  1   HR  Delhi A 1000.0 
    1  2   NaN  NaN B  NaN 
    2  3  Finance  NaN C 3000.0 
    3  4   NaN  NaN D 8000.0 
    4  5 Programming  NaN E 6000.0 
    5  8  Admin Mumbai B  NaN 
    6  9   Ops Banglore D  NaN 
    7  10 Analytics Mumbai K  NaN 
    

    편집 : 열 몇 가지 주문

    reindex이 필요합니다 :

    #concatenate all columns names togetehr and remove dupes 
    ColNames = pd.Index(np.concatenate([df_second.columns, df_first.columns])).drop_duplicates() 
    print (ColNames) 
    Index(['EmpID', 'Name', 'Department', 'Location', 'Salary'], dtype='object') 
    
    df = (df_first.set_index('EmpID') 
         .combine_first(df_second.set_index('EmpID')) 
         .reset_index() 
         .reindex(columns=ColNames)) 
    print (df) 
        EmpID Name Department Location Salary 
    0  1 A   HR  Delhi 1000.0 
    1  2 B   NaN  NaN  NaN 
    2  3 C  Finance  NaN 3000.0 
    3  4 D   NaN  NaN 8000.0 
    4  5 E Programming  NaN 6000.0 
    5  8 B  Admin Mumbai  NaN 
    6  9 D   Ops Banglore  NaN 
    7  10 K Analytics Mumbai  NaN 
    
    +0

    이 솔루션은 목적을 달성하지만 열 순서를 유지할 수 있는지 확인하기를 원했습니다. 먼저 첫 번째 데이터 프레임부터 두 번째 데이터 프레임까지의 열을 가져야합니다. 또한 외부 조인을 사용하여 수행 할 수 있다면 여전히 생각 중입니다. –

    +0

    이해가 확실하지 않은 이유는 무엇입니까? 더 설명해 주시겠습니까? – jezrael

    +0

    실제 데이터 세트에는 약 200 개의 열이 있으며 특정 순서로 설정됩니다. 데이터 집합은 오랜 시간 동안 만 순서대로 처리되었으며이 작업을 수행하면이 데이터 집합에서 작업하는 사람들이 익숙하지 않은 정렬 된 열 순서가 지정됩니다. 그래서 열 순서를 보존 할 수있는 방법이 있다면 그냥 생각하고있었습니다. –

    관련 문제