복붙노트

[PYTHON] 팬더 데이터 프레임에서 2 열의 값을 단일 열로 합치십시오.

PYTHON

팬더 데이터 프레임에서 2 열의 값을 단일 열로 합치십시오.

나는 T-SQL에서 병합과 비슷한 동작을하는 메소드를 찾고있다. 팬더 데이터 프레임에 드문 드문 두 열 (열 A와 B)이 있습니다. 다음 규칙을 사용하여 새 열을 만들고 싶습니다.

앞에서 언급했듯이 이것은 coalesce 함수를 통해 MS SQL Server에서 수행 할 수 있습니다. 나는 이것을위한 좋은 pythonic 방법을 발견하지 못했다. 존재하나요?

해결법

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

    1.combine_first () 사용 :

    combine_first () 사용 :

    In [16]: df = pd.DataFrame(np.random.randint(0, 10, size=(10, 2)), columns=list('ab'))
    
    In [17]: df.loc[::2, 'a'] = np.nan
    
    In [18]: df
    Out[18]:
         a  b
    0  NaN  0
    1  5.0  5
    2  NaN  8
    3  2.0  8
    4  NaN  3
    5  9.0  4
    6  NaN  7
    7  2.0  0
    8  NaN  6
    9  2.0  5
    
    In [19]: df['c'] = df.a.combine_first(df.b)
    
    In [20]: df
    Out[20]:
         a  b    c
    0  NaN  0  0.0
    1  5.0  5  5.0
    2  NaN  8  8.0
    3  2.0  8  2.0
    4  NaN  3  3.0
    5  9.0  4  9.0
    6  NaN  7  7.0
    7  2.0  0  2.0
    8  NaN  6  6.0
    9  2.0  5  2.0
    
  2. ==============================

    2.이것을 사용해보십시오. 기억하기 쉽습니다.

    이것을 사용해보십시오. 기억하기 쉽습니다.

    df['c'] = np.where(df["a"].isnull(), df["b"], df["a"] )
    

    df [ "c"] = np.where (df [ "a"]. isnull () == True, df [ "b"], df [ "a"])

    %timeit df['d'] = df.a.combine_first(df.b)
    1000 loops, best of 3: 472 µs per loop
    
    
    %timeit  df['c'] = np.where(df["a"].isnull(), df["b"], df["a"] )
    1000 loops, best of 3: 291 µs per loop
    
  3. ==============================

    3.combine_first는 가장 직접적인 옵션입니다. 아래에서 개략적으로 설명하는 몇 가지가 있습니다. 나는 몇 가지 해결책을 개략적으로 설명 할 것이고, 어떤 경우는 다른 경우에 적용 할 수있다.

    combine_first는 가장 직접적인 옵션입니다. 아래에서 개략적으로 설명하는 몇 가지가 있습니다. 나는 몇 가지 해결책을 개략적으로 설명 할 것이고, 어떤 경우는 다른 경우에 적용 할 수있다.

    모든 행에 NaN가있는 것은 아니고 이러한 NaN은 열간에 상호 배타적이지 않습니다.

    설정

    df
    
         a    b
    0  1.0  5.0
    1  2.0  3.0
    2  3.0  NaN
    3  NaN  4.0
    4  5.0  NaN
    5  7.0  6.0
    6  NaN  7.0
    

    먼저에 결합하자.

    옵션 1 pd.Series.mask

    df.a.mask(pd.isnull, df.b)
    

    또는,

    df.a.mask(df.a.isnull(), df.b)
    
    0    1.0
    1    2.0
    2    3.0
    3    4.0
    4    5.0
    5    7.0
    6    7.0
    Name: a, dtype: float64
    

    옵션 2 pd.Series.where (Jon Clements에 의해 영감을 얻음)

    df.a.where(pd.notnull, df.b)
    
    0    1.0
    1    2.0
    2    3.0
    3    4.0
    4    5.0
    5    7.0
    6    7.0
    Name: a, dtype: float64
    

    또는 b를 먼저 결합하여 주변 조건을 전환하십시오.

    모든 행에는 열간에 상호 배타적 인 NaN가 있습니다.

    설정

    df
         a    b
    0  1.0  NaN
    1  2.0  NaN
    2  3.0  NaN
    3  NaN  4.0
    4  5.0  NaN
    5  NaN  6.0
    6  NaN  7.0
    

    옵션 1 pd.Series.add

    a.add(b, fill_value=0)
    
    0    1.0
    1    2.0
    2    3.0
    3    4.0
    4    5.0
    5    6.0
    6    7.0
    dtype: float64
    

    옵션 2 fillna + sum -

    df.fillna(0).sum(1)
    
    0    1.0
    1    2.0
    2    3.0
    3    4.0
    4    5.0
    5    6.0
    6    7.0
    dtype: float64
    

    이것은 여러 컬럼으로 일반화하는 유일한 솔루션입니다 -

    df.iloc[:, i:j].fillna(0).sum(1)
    
  4. from https://stackoverflow.com/questions/38152389/coalesce-values-from-2-columns-into-a-single-column-in-a-pandas-dataframe by cc-by-sa and MIT license