ฉันคาดว่าไวยากรณ์ของคุณจะใช้งานได้เช่นกัน ปัญหาเกิดขึ้นเนื่องจากเมื่อคุณสร้างคอลัมน์ใหม่ด้วยไวยากรณ์รายการคอลัมน์ (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) การมอบหมายงานสามอย่างในหนึ่งเดียวโดยใช้การเปิดรายการ:
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 เป็นวิธีที่ "เป็นธรรมชาติ" มากกว่าในการสร้าง data frame ใหม่กว่าสองรายการก่อนหน้า แต่คอลัมน์ใหม่จะเรียงตามตัวอักษร (อย่างน้อยก่อน 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)
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
KeyError: "None of [Index(['column_new_1', 'column_new_2', 'column_new_3'], dtype='object')] are in the [columns]"