복붙노트

[PYTHON] 여러 열을 판다에 동시에 추가

PYTHON

여러 열을 판다에 동시에 추가

나는 팬더에 익숙하지 않고 여러 칸을 동시에 판다에 추가하는 방법을 알아 내려고 노력하고 있습니다. 여기에 어떤 도움을 주시면 감사하겠습니다. 이상적으로는 여러 단계를 거치지 않고 한 단계로이 작업을 수행하고 싶습니다 ...

import pandas as pd

df = {'col_1': [0, 1, 2, 3],
        'col_2': [4, 5, 6, 7]}
df = pd.DataFrame(df)

df[[ 'column_new_1', 'column_new_2','column_new_3']] = [np.nan, 'dogs',3]  #thought this would work here...

해결법

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

    1.구문이 제대로 작동 할 것으로 기대했을 것입니다. 문제는 열 목록 구문 (df [[new1, new2]] = ...)을 사용하여 새 열을 만들면 오른쪽이 DataFrame이어야한다는 것을 요구하기 때문에 발생합니다. DataFrame의 열은 만들려는 열과 이름이 같습니다.

    구문이 제대로 작동 할 것으로 기대했을 것입니다. 문제는 열 목록 구문 (df [[new1, new2]] = ...)을 사용하여 새 열을 만들면 오른쪽이 DataFrame이어야한다는 것을 요구하기 때문에 발생합니다. DataFrame의 열은 만들려는 열과 이름이 같습니다.

    구문은 기존 열에 스칼라 값을 할당하는 데 잘 작동하며 팬더는 단일 열 구문 (df [new1] = ...)을 사용하여 새로운 열에 스칼라 값을 할당하게됩니다. 따라서이 문제를 여러 단일 열 할당으로 변환하거나 오른쪽에 적합한 DataFrame을 만듭니다.

    다음과 같은 몇 가지 접근 방법이 있습니다.

    import pandas as pd
    import numpy as np
    
    df = pd.DataFrame({
        'col_1': [0, 1, 2, 3],
        'col_2': [4, 5, 6, 7]
    })
    

    그런 다음 다음 중 하나입니다.

    (1) 기술적으로 이것은 3 단계이지만 1 단계처럼 보입니다.

    df['column_new_1'], df['column_new_2'], df['column_new_3'] = [np.nan, 'dogs', 3]
    

    (2) DataFrame은 편리하게 단일 행을 인덱스와 일치하도록 확장하므로 다음과 같이 할 수 있습니다.

    df[['column_new_1', 'column_new_2', 'column_new_3']] = pd.DataFrame([[np.nan, 'dogs', 3]], index=df.index)
    

    (3) 이것은 새로운 컬럼으로 임시 데이터 프레임을 만들고 나중에 원래의 데이터 프레임과 결합하면 잘 작동합니다 :

    df = pd.concat(
        [
            df,
            pd.DataFrame(
                [[np.nan, 'dogs', 3]], 
                index=df.index, 
                columns=['column_new_1', 'column_new_2', 'column_new_3']
            )
        ], axis=1
    )
    

    (4) 이전과 비슷하지만 concat 대신 join을 사용합니다 (덜 효율적일 수 있음).

    df = df.join(pd.DataFrame(
        [[np.nan, 'dogs', 3]], 
        index=df.index, 
        columns=['column_new_1', 'column_new_2', 'column_new_3']
    ))
    

    (5) 이것은 이전의 두 개보다 새로운 데이터 프레임을 만드는 "자연스러운"방법이지만, 새로운 컬럼은 알파벳 순으로 정렬됩니다 (최소한 파이썬 3.6 또는 3.7 이전) :

    df = df.join(pd.DataFrame(
        {
            'column_new_1': np.nan,
            'column_new_2': 'dogs',
            'column_new_3': 3
        }, index=df.index
    ))
    

    (6) 나는이 변종을 @ zero의 대답에 많이 좋아하지만 이전 열과 마찬가지로 새로운 열은 적어도 초기 버전의 Python에서는 항상 알파벳 순으로 정렬됩니다.

    df = df.assign(column_new_1=np.nan, column_new_2='dogs', column_new_3=3)
    

    (7) 이것은 흥미롭지 만 (https://stackoverflow.com/a/44951376/3830997 기반), 문제가 될만한시기는 언제인지 모르겠습니다.

    new_cols = ['column_new_1', 'column_new_2', 'column_new_3']
    new_vals = [np.nan, 'dogs', 3]
    df = df.reindex(columns=df.columns.tolist() + new_cols)   # add empty cols
    df[new_cols] = new_vals  # multi-column assignment works for existing cols
    

    (8) 결국 이길 수 없다.

    df['column_new_1'] = np.nan
    df['column_new_2'] = 'dogs'
    df['column_new_3'] = 3
    

    참고 : 이러한 옵션 중 다수는 이미 다른 답변에서 다뤘습니다. DataFrame에 여러 열을 추가하고 기존 열과 동일하게 설정합니다. 한 번에 여러 열을 팬ダ 데이터 프레임에 추가 할 수 있습니까?, Pandas : 여러 빈 열 추가 DataFrame

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

    2.당신은 컬럼 이름과 값의 dict과 함께 assign을 사용할 수 있습니다.

    당신은 컬럼 이름과 값의 dict과 함께 assign을 사용할 수 있습니다.

    In [1069]: df.assign(**{'col_new_1': np.nan, 'col2_new_2': 'dogs', 'col3_new_3': 3})
    Out[1069]:
       col_1  col_2 col2_new_2  col3_new_3  col_new_1
    0      0      4       dogs           3        NaN
    1      1      5       dogs           3        NaN
    2      2      6       dogs           3        NaN
    3      3      7       dogs           3        NaN
    
  3. ==============================

    3.concat의 사용 :

    concat의 사용 :

    In [128]: df
    Out[128]: 
       col_1  col_2
    0      0      4
    1      1      5
    2      2      6
    3      3      7
    
    In [129]: pd.concat([df, pd.DataFrame(columns = [ 'column_new_1', 'column_new_2','column_new_3'])])
    Out[129]: 
       col_1  col_2 column_new_1 column_new_2 column_new_3
    0    0.0    4.0          NaN          NaN          NaN
    1    1.0    5.0          NaN          NaN          NaN
    2    2.0    6.0          NaN          NaN          NaN
    3    3.0    7.0          NaN          NaN          NaN
    

    [np.nan, 'dogs', 3]으로 무엇을하고 싶은지 잘 모르겠습니다. 어쩌면 지금은 기본값으로 설정?

    In [142]: df1 = pd.concat([df, pd.DataFrame(columns = [ 'column_new_1', 'column_new_2','column_new_3'])])
    In [143]: df1[[ 'column_new_1', 'column_new_2','column_new_3']] = [np.nan, 'dogs', 3]
    
    In [144]: df1
    Out[144]: 
       col_1  col_2  column_new_1 column_new_2  column_new_3
    0    0.0    4.0           NaN         dogs             3
    1    1.0    5.0           NaN         dogs             3
    2    2.0    6.0           NaN         dogs             3
    3    3.0    7.0           NaN         dogs             3
    
  4. ==============================

    4.목록 이해, pd.DataFrame 및 pd.concat 사용

    목록 이해, pd.DataFrame 및 pd.concat 사용

    pd.concat(
        [
            df,
            pd.DataFrame(
                [[np.nan, 'dogs', 3] for _ in range(df.shape[0])],
                df.index, ['column_new_1', 'column_new_2','column_new_3']
            )
        ], axis=1)
    

  5. ==============================

    5.@Matthias Fripp의 대답에서 option2를 지적하고 싶습니다.

    @Matthias Fripp의 대답에서 option2를 지적하고 싶습니다.

    판다의 문서에 이미 문서화되어있다. http://pandas.pydata.org/pandas-docs/stable/indexing.html#basics

  6. from https://stackoverflow.com/questions/39050539/adding-multiple-columns-to-pandas-simultaneously by cc-by-sa and MIT license