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

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



답변

구문도 작동 할 것으로 예상했을 것입니다. 열 목록 구문 ( 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에 여러 개의 빈 열 추가


답변

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


답변

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


답변

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

여기에 이미지 설명 입력


답변

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

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

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


답변

@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 )을 있습니다.


답변

빈 새 열만 추가하려는 경우 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으로 답하십시오.