하나의 할당에서 Pandas 데이터 프레임에 여러 열을 추가하는 방법은 무엇입니까?


122

저는 pandas를 처음 사용하고 pandas에 여러 열을 동시에 추가하는 방법을 알아 내려고 노력하고 있습니다. 여기에 도움을 주시면 감사하겠습니다. 이상적으로는 여러 단계를 반복하는 대신 한 단계로 수행하고 싶습니다.

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...

어떤 오류가 발생했는지 설명해야합니다. 내가 pandas 1.0에서 이것을 시도하면 내가 얻는다KeyError: "None of [Index(['column_new_1', 'column_new_2', 'column_new_3'], dtype='object')] are in the [columns]"
smci

답변:


185

구문도 작동 할 것으로 예상했을 것입니다. 열 목록 구문 ( df[[new1, new2]] = ...) 을 사용하여 새 열을 만들 때 pandas에서 오른쪽이 DataFrame이되어야 하기 때문에 문제가 발생합니다 ( DataFrame의 열이 열과 이름이 같은지 여부는 실제로 중요하지 않습니다. 당신이 만들고 있습니다).

귀하의 구문은 기존 열에 스칼라 값을 할당하는 데 잘 작동 하며 pandas는 단일 열 구문 ( 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) 목록 압축 해제를 사용하여 하나의 세 가지 할당 :

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) 이전과 유사하지만 join대신 사용 concat(효율성이 떨어질 수 있음) :

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

5) dict를 사용하는 것은 이전 두 데이터 프레임보다 새 데이터 프레임을 만드는 더 "자연스러운"방법이지만 새 열은 알파벳순으로 정렬됩니다 (적어도 Python 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) .assign()여러 열 인수와 함께 사용하십시오 .

@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에 여러 열을 추가하고 기존 열을 동일하게 설정 , 그것은 팬더 DataFrame로 한 번에 여러 열을 추가 할 수 있습니까? , pandas DataFrame에 여러 개의 빈 열 추가


# 7 ( .reindex)에 접근 하면 데이터 프레임의 인덱스가 변경 되지 않습니까? 명시적인 목표가 아닌 이상 열을 추가 할 때 누군가가 불필요하게 인덱스를 변경하고 싶어하는 이유는 ...
Acumenus

1
.reindex()columns인수 와 함께 사용 되므로 "index"(이름) 열만 변경합니다. 행 인덱스를 변경하지 않습니다.
Matthias Fripp

일부 접근 방식의 경우 다음을 사용할 수 있습니다 OrderedDict. 예 :df.join(pd.DataFrame( OrderedDict([('column_new_2', 'dogs'),('column_new_1', np.nan),('column_new_3', 3)]), index=df.index ))
hashmuke

@hashmuke 초기 버전의 Python에 적합합니다. 특히 Pandas에서 여러 가지 사전을 사용하는 사람들에게 어필 할 수 있습니다. 예 : df = pd.DataFrame({'before': [1, 2, 3], 'after': [4, 5, 6]})vs.df = pd.DataFrame(OrderedDict([('before', [1, 2, 3]), ('after', [4, 5, 6])])
Matthias Fripp

2
과 함께 옵션을 사용하는 경우 join색인에 중복이 없는지 확인하십시오 (또는 reset_index첫 번째를 사용하십시오 ). 디버깅 시간을 절약 할 수 있습니다.
귀도

40

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

열의 특정 순서를 유지하는 동일한 방법이 있습니까?
user48956

1
assign을 여러 번 호출하여 이전 버전의 Python에서 특정 순서를 유지할 수 있습니다. df.assign(**{'col_new_1': np.nan}).assign(**{'col2_new_2': 'dogs'}).assign(**{'col3_new_3': 3})
skasch

열 이름에 유효한 변수 이름 인 문자열 만 포함 된 경우 : df.assign(col_new_1=np.nan, col2_new_2='dogs', col3_new_3=3). 이것은 질서를 유지합니다.
Tobias Bergkvist

9

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

한 단계에서 두 번째 부분을 수행하는 방법이 있다면 예를 들어 열의 상수 값입니다.
runningbirds

3

지능형리스트의 사용 pd.DataFramepd.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)

여기에 이미지 설명 입력


3

동일한 값으로 누락 된 열 (a, b, c, ....)을 많이 추가하면 여기에 0이 있습니다.

    new_cols = ["a", "b", "c" ] 
    df[new_cols] = pd.DataFrame([[0] * len(new_cols)], index=df.index)

허용되는 답변의 두 번째 변형을 기반으로합니다.


0

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

(2) DataFrame이 반드시 이런 방식으로 작동 할 것이라고 기대하지는 않지만

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

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

열 목록을 []에 전달하여 순서대로 열을 선택할 수 있습니다. 열이 DataFrame에 포함되지 않은 경우 예외가 발생합니다. 이 방식으로 여러 열을 설정할 수도 있습니다. 변환 (열의 하위 집합에 in-place )을 있습니다.


나는 이것이 다중 열 할당에 대한 꽤 표준이라고 생각합니다. 나를 놀라게 한 부분 pd.DataFrame([[np.nan, 'dogs', 3]], index=df.index)은 인덱스와 동일한 길이의 전체 데이터 프레임을 생성하기 위해 주어진 하나의 행 을 복제 한다는 것입니다.
Matthias Fripp

0

빈 새 열만 추가하려는 경우 reindex 가 작업을 수행합니다.

df
   col_1  col_2
0      0      4
1      1      5
2      2      6
3      3      7

df.reindex(list(df)+['column_new_1', 'column_new_2','column_new_3'], axis=1)
   col_1  col_2  column_new_1  column_new_2  column_new_3
0      0      4           NaN           NaN           NaN
1      1      5           NaN           NaN           NaN
2      2      6           NaN           NaN           NaN
3      3      7           NaN           NaN           NaN

전체 코드 예

import numpy as np
import pandas as pd

df = {'col_1': [0, 1, 2, 3],
        'col_2': [4, 5, 6, 7]}
df = pd.DataFrame(df)
print('df',df, sep='\n')
print()
df=df.reindex(list(df)+['column_new_1', 'column_new_2','column_new_3'], axis=1)
print('''df.reindex(list(df)+['column_new_1', 'column_new_2','column_new_3'], axis=1)''',df, sep='\n')

그렇지 않으면 할당으로 0으로 답하십시오.


0

나는 "인덱스"를 사용하는 것이 편하지 않다 등등…

df.columns
Index(['A123', 'B123'], dtype='object')

df=pd.concat([df,pd.DataFrame(columns=list('CDE'))])

df.rename(columns={
    'C':'C123',
    'D':'D123',
    'E':'E123'
},inplace=True)


df.columns
Index(['A123', 'B123', 'C123', 'D123', 'E123'], dtype='object')
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.