판다 데이터 프레임에 여러 열을 한 번에 추가하는 방법은 무엇입니까?
저는 판다를 처음 접하는데 판다에 여러 기둥을 동시에 추가하는 방법을 찾고 있습니다.어떤 도움이라도 주셔서 감사합니다.이상적으로는 여러 단계를 반복하는 것보다 한 단계로 이 작업을 수행하고 싶습니다.
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...
당신의 구문도 작동하리라 예상했을 것입니다. 구문column-list)을 합니다.df[[new1, new2]] = ...
팬더는 오른쪽이 DataFrame이어야 합니다(DataFrame의 컬럼이 작성 중인 컬럼과 이름이 같으면 실제로 문제가 되지 않습니다).
구문은 기존 열에 스칼라 값을 할당하는 데 적합하며, 팬더도 단일 열 구문을 사용하여 새 열에 스칼라 값을 할당할 수 있습니다.df[new1] = ...
따라서 이를 여러 개의 단일 열 할당으로 변환하거나 오른쪽에 적합한 Data Frame을 생성하는 것이 해결책입니다.
기능하는 접근방식은 다음과 같습니다.
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)를 사용합니다.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's answer에 대한 이 변종이 매우 마음에 들지만, 이전 것과 마찬가지로 새로운 열은 항상 알파벳 순으로 정렬됩니다. 적어도 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에 여러 열을 동시에 추가할 수 있습니까?팬더 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
판다를 쓸 때 내 목표는 효율적으로 읽을 수 있는 코드를 쓰는 것이다.내가 왜 여기서 쇠사슬을 그렇게 좋아하는지는 설명하지 않을 것이다. 나는 그것을 내 책 "이펙트 팬더"에서 자세히 설명하겠다.
종종 체인을 할 수 있는 간결한 방법으로 새 열을 추가하고 싶습니다.은 '업데이트'나 ''을 ''나 '컬럼'으로입니다..assign
★★★★★★ 。
질문에 답하기 위해 다음 코드를 사용합니다.
(df
.assign(column_new_1=np.nan,
column_new_2='dogs',
column_new_3=3
)
)
조금 더 나아가다.데이터 프레임에 추가할 새 열이 있는 데이터 프레임이 있는 경우가 많습니다.예를 들어, 원하는 세 개의 열이 있는 데이터 프레임처럼 생겼다고 가정해 봅시다.
df2 = pd.DataFrame({'column_new_1': np.nan,
'column_new_2': 'dogs',
'column_new_3': 3},
index=df.index
)
이 경우 다음 코드를 작성합니다.
(df
.assign(**df2)
)
콘캣 사용 시:
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.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)
결측 열(a, b, c, ...)이 같은 값(여기서 0)을 많이 추가하면 다음과 같이 됩니다.
new_cols = ["a", "b", "c" ]
df[new_cols] = pd.DataFrame([[0] * len(new_cols)], index=df.index)
인정된 답변의 두 번째 변형에 기초하고 있습니다.
@Matthias Fripp의 답변에서 옵션 2를 지적하고 싶습니다.
(2) Data Frame이 반드시 이러한 방식으로 동작할 것이라고는 생각하지 않지만, 실제로 동작하고 있습니다.
dfclum'column_new_1', 'column_new_2', 'column_new_3'] = pd.DataFrame([np.nan, 'dogs', 3]), index=df.index)
팬더 자신의 문서에 이미 기록되어 있다.http://pandas.pydata.org/pandas-docs/stable/indexing.html#basics
열 목록을 []에 전달하여 해당 순서로 열을 선택할 수 있습니다.열이 DataFrame에 포함되지 않으면 예외가 발생합니다.이 방법으로 여러 열을 설정할 수도 있습니다.이 기능은 변환(in-place)을 열의 하위 집합에 적용하는 데 유용할 수 있습니다.
과 " " ".assign()
:
이 방법은 많은 열을 작업할 때 값을 사용하여 새 열을 할당하는 가장 읽기 쉽고 동적인 방법입니다.
import pandas as pd
import numpy as np
new_cols = ["column_new_1", "column_new_2", "column_new_3"]
new_vals = [np.nan, "dogs", 3]
# Map new columns as keys and new values as values
col_val_mapping = dict(zip(new_cols, new_vals))
# Unpack new column/new value pairs and assign them to the data frame
df = df.assign(**col_val_mapping)
값이 어떻게 될지 알 수 없거나 새 열이 많아 새 열 값을 비워 두려는 경우입니다.
import pandas as pd
import numpy as np
new_cols = ["column_new_1", "column_new_2", "column_new_3"]
new_vals = [None for item in new_cols]
# Map new columns as keys and new values as values
col_val_mapping = dict(zip(new_cols, new_vals))
# Unpack new column/new value pairs and assign them to the data frame
df = df.assign(**col_val_mapping)
빈 새 열만 추가하려면 재색인이 작업을 수행합니다.
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')
"Index"를 사용하는 것이 불편하여 아래와 같이 표시될 수 있습니다.
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')
각 열에 대해 다른 값을 원하는 경우 사전에서 값을 인스턴스화할 수 있습니다.또한 사전에 사전을 작성하는 것도 상관없습니다.
>>> import pandas as pd
>>> import numpy as np
>>> df = pd.DataFrame({
'col_1': [0, 1, 2, 3],
'col_2': [4, 5, 6, 7]
})
>>> df
col_1 col_2
0 0 4
1 1 5
2 2 6
3 3 7
>>> cols = {
'column_new_1':np.nan,
'column_new_2':'dogs',
'column_new_3': 3
}
>>> df[list(cols)] = pd.DataFrame(data={k:[v]*len(df) for k,v in cols.items()})
>>> df
col_1 col_2 column_new_1 column_new_2 column_new_3
0 0 4 NaN dogs 3
1 1 5 NaN dogs 3
2 2 6 NaN dogs 3
3 3 7 NaN dogs 3
인정된 답변보다 나을 필요는 없지만 아직 나열되지 않은 또 다른 접근법입니다.
import pandas as pd
df = pd.DataFrame({
'col_1': [0, 1, 2, 3],
'col_2': [4, 5, 6, 7]
})
df['col_3'], df['col_4'] = [df.col_1]*2
>> df
col_1 col_2 col_3 col_4
0 4 0 0
1 5 1 1
2 6 2 2
3 7 3 3
언급URL : https://stackoverflow.com/questions/39050539/how-to-add-multiple-columns-to-pandas-dataframe-in-one-assignment
'programing' 카테고리의 다른 글
MariaDB와 MySQL의 처리 날짜 필드가 문자열과 비교하여 다릅니다. (0) | 2022.10.01 |
---|---|
합계가 값보다 작은 행을 테이블에서 가져옵니다. (0) | 2022.10.01 |
구성별로 HashSet 값을 초기화하려면 어떻게 해야 합니까? (0) | 2022.10.01 |
PHP5에서 Singleton 디자인 패턴 만들기 (0) | 2022.10.01 |
설치 후 즉시 MariaDB 서비스가 실패함(CentOS7 (0) | 2022.10.01 |