복붙노트

[PYTHON] Pandas / Python : 중복없이 두 개의 데이터 프레임을 연결하는 방법은 무엇입니까?

PYTHON

Pandas / Python : 중복없이 두 개의 데이터 프레임을 연결하는 방법은 무엇입니까?

두 개의 데이터 프레임을 A, B를 중복 행없이 새로운 행에 연결하고 싶습니다 (B의 행이 이미 A에 추가 된 경우 추가하지 마십시오).

데이터 프레임 A : 데이터 프레임 B :

   I    II    I    II
0  1    2     5    6
1  3    1     3    1

새로운 데이터 프레임 :

     I    II
  0  1    2
  1  3    1
  2  5    6

어떻게해야합니까?

해결법

  1. ==============================

    1.가장 간단한 방법은 연결을 수행 한 다음 중복 제거하는 것입니다.

    가장 간단한 방법은 연결을 수행 한 다음 중복 제거하는 것입니다.

    >>> df1
       A  B
    0  1  2
    1  3  1
    >>> df2
       A  B
    0  5  6
    1  3  1
    >>> pandas.concat([df1,df2]).drop_duplicates().reset_index(drop=True)
       A  B
    0  1  2
    1  3  1
    2  5  6
    

    reset_index (drop = True)는 concat () 및 drop_duplicates () 다음에 색인을 수정합니다. 그것 없이는 [0,1,2] 대신 [0,1,0]의 색인을 갖게됩니다. 이 설정이 즉시 재설정되지 않으면이 데이터 프레임에 대한 추가 작업에 문제가 발생할 수 있습니다.

  2. ==============================

    2.DataFrame A에 이미 중복 행이있는 경우 중복 행을 연결 한 다음 삭제하면 DataFrame A에서 보관하려는 행이 제거됩니다.

    DataFrame A에 이미 중복 행이있는 경우 중복 행을 연결 한 다음 삭제하면 DataFrame A에서 보관하려는 행이 제거됩니다.

    이 경우 누적 개수로 새 열을 만든 다음 중복을 제거해야하며, 모두 유스 케이스에 따라 다르지만 시계열 데이터에서는 일반적입니다.

    다음은 그 예입니다.

    df_1 = pd.DataFrame([
    {'date':'11/20/2015', 'id':4, 'value':24},
    {'date':'11/20/2015', 'id':4, 'value':24},
    {'date':'11/20/2015', 'id':6, 'value':34},])
    
    df_2 = pd.DataFrame([
    {'date':'11/20/2015', 'id':4, 'value':24},
    {'date':'11/20/2015', 'id':6, 'value':14},
    ])
    
    
    df_1['count'] = df_1.groupby(['date','id','value']).cumcount()
    df_2['count'] = df_2.groupby(['date','id','value']).cumcount()
    
    df_tot = pd.concat([df_1,df_2], ignore_index=False)
    df_tot = df_tot.drop_duplicates()
    df_tot = df_tot.drop(['count'], axis=1)
    >>> df_tot
    
    date    id  value
    0   11/20/2015  4   24
    1   11/20/2015  4   24
    2   11/20/2015  6   34
    1   11/20/2015  6   14
    
  3. ==============================

    3.팬더가이 작업을위한 기본 솔루션을 제공하지 않는다는 것에 놀랐습니다. 대규모 데이터 세트로 작업하는 경우 복제본을 삭제하는 것이 효율적이라고 생각하지 않습니다 (Rian G가 제안한대로).

    팬더가이 작업을위한 기본 솔루션을 제공하지 않는다는 것에 놀랐습니다. 대규모 데이터 세트로 작업하는 경우 복제본을 삭제하는 것이 효율적이라고 생각하지 않습니다 (Rian G가 제안한대로).

    겹치지 않는 인덱스를 찾기 위해 세트를 사용하는 것이 가장 효율적일 것입니다. 그런 다음 목록 이해를 사용하여 인덱스를 '행 위치'(부울 값)로 변환하십시오.이 행은 iloc [,]을 사용하여 행에 액세스해야합니다. 아래에서 작업을 수행하는 함수를 찾으십시오. 중복을 확인하기 위해 특정 열 (col)을 선택하지 않으면 요청한대로 색인이 사용됩니다. 특정 열을 선택한 경우 'a'의 기존 중복 항목이 결과에 남아 있음을 유의하십시오.

    import pandas as pd
    
    def append_non_duplicates(a, b, col=None):
        if ((a is not None and type(a) is not pd.core.frame.DataFrame) or (b is not None and type(b) is not pd.core.frame.DataFrame)):
            raise ValueError('a and b must be of type pandas.core.frame.DataFrame.')
        if (a is None):
            return(b)
        if (b is None):
            return(a)
        if(col is not None):
            aind = a.iloc[:,col].values
            bind = b.iloc[:,col].values
        else:
            aind = a.index.values
            bind = b.index.values
        take_rows = list(set(bind)-set(aind))
        take_rows = [i in take_rows for i in bind]
        return(a.append( b.iloc[take_rows,:] ))
    
    # Usage
    a = pd.DataFrame([[1,2,3],[1,5,6],[1,12,13]], index=[1000,2000,5000])
    b = pd.DataFrame([[1,2,3],[4,5,6],[7,8,9]], index=[1000,2000,3000])
    
    append_non_duplicates(a,b)
    #        0   1   2
    # 1000   1   2   3    <- from a
    # 2000   1   5   6    <- from a
    # 5000   1  12  13    <- from a
    # 3000   7   8   9    <- from b
    
    append_non_duplicates(a,b,0)
    #       0   1   2
    # 1000  1   2   3    <- from a
    # 2000  1   5   6    <- from a
    # 5000  1  12  13    <- from a
    # 2000  4   5   6    <- from b
    # 3000  7   8   9    <- from b
    
  4. from https://stackoverflow.com/questions/21317384/pandas-python-how-to-concatenate-two-dataframes-without-duplicates by cc-by-sa and MIT license