Tôi đã mong đợi cú pháp của bạn cũng hoạt động. Vấn đề nảy sinh vì khi bạn tạo các cột mới với cú pháp danh sách cột ( df[[new1, new2]] = ...
), gấu trúc yêu cầu phía bên tay phải là DataFrame (lưu ý rằng không thực sự quan trọng nếu các cột của DataFrame có cùng tên với các cột bạn đang tạo).
Cú pháp của bạn hoạt động tốt khi gán giá trị vô hướng cho các cột hiện có và gấu trúc cũng rất vui khi chỉ định giá trị vô hướng cho một cột mới bằng cú pháp cột đơn ( df[new1] = ...
). Vì vậy, giải pháp là chuyển đổi điều này thành một số nhiệm vụ cột đơn hoặc tạo DataFrame phù hợp cho phía bên tay phải.
Dưới đây là một số cách tiếp cận sẽ hoạt động:
import pandas as pd
import numpy as np
df = pd.DataFrame({
'col_1': [0, 1, 2, 3],
'col_2': [4, 5, 6, 7]
})
Sau đó, một trong những điều sau:
1) Ba nhiệm vụ trong một, sử dụng giải nén danh sách:
df['column_new_1'], df['column_new_2'], df['column_new_3'] = [np.nan, 'dogs', 3]
2) DataFrame
mở rộng một cách thuận tiện một hàng để khớp với chỉ mục, vì vậy bạn có thể thực hiện điều này:
df[['column_new_1', 'column_new_2', 'column_new_3']] = pd.DataFrame([[np.nan, 'dogs', 3]], index=df.index)
3) Tạo khung dữ liệu tạm thời với các cột mới, sau đó kết hợp với khung dữ liệu ban đầu sau:
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) Tương tự như trước, nhưng sử dụng join
thay vì concat
(có thể kém hiệu quả hơn):
df = df.join(pd.DataFrame(
[[np.nan, 'dogs', 3]],
index=df.index,
columns=['column_new_1', 'column_new_2', 'column_new_3']
))
5) Sử dụng dict là một cách "tự nhiên" hơn để tạo khung dữ liệu mới so với hai cách trước, nhưng các cột mới sẽ được sắp xếp theo thứ tự bảng chữ cái (ít nhất là trước Python 3.6 hoặc 3.7 ):
df = df.join(pd.DataFrame(
{
'column_new_1': np.nan,
'column_new_2': 'dogs',
'column_new_3': 3
}, index=df.index
))
6) Sử dụng .assign()
với nhiều đối số cột.
Tôi thích biến thể này trên câu trả lời của @ zero rất nhiều, nhưng giống như phiên bản trước, các cột mới sẽ luôn được sắp xếp theo thứ tự bảng chữ cái, ít nhất là với các phiên bản đầu tiên của Python:
df = df.assign(column_new_1=np.nan, column_new_2='dogs', column_new_3=3)
7) Điều này thật thú vị (dựa trên https://stackoverflow.com/a/44951376/3830997 ), nhưng tôi không biết khi nào nó sẽ đáng gặp phải rắc rối:
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) Cuối cùng, thật khó để đánh bại ba bài tập riêng biệt:
df['column_new_1'] = np.nan
df['column_new_2'] = 'dogs'
df['column_new_3'] = 3
Lưu ý: nhiều tùy chọn này đã được đề cập trong các câu trả lời khác: Thêm nhiều cột vào DataFrame và đặt chúng bằng một cột hiện có , Có thể thêm nhiều cột cùng một lúc vào DataFrame của gấu trúc không? , Thêm nhiều cột trống vào DataFrame của gấu trúc
KeyError: "None of [Index(['column_new_1', 'column_new_2', 'column_new_3'], dtype='object')] are in the [columns]"