Saya berharap sintaks Anda berfungsi juga. Masalah muncul karena saat Anda membuat kolom baru dengan sintaks daftar kolom ( df[[new1, new2]] = ...
), panda mengharuskan sisi kanan menjadi DataFrame (perhatikan bahwa tidak masalah jika kolom dari DataFrame memiliki nama yang sama dengan kolom Anda sedang membuat).
Sintaks Anda berfungsi dengan baik untuk menetapkan nilai skalar ke kolom yang ada , dan panda juga dengan senang hati menetapkan nilai skalar ke kolom baru menggunakan sintaks kolom tunggal ( df[new1] = ...
). Jadi solusinya adalah dengan mengubahnya menjadi beberapa tugas kolom tunggal, atau membuat DataFrame yang sesuai untuk sisi kanan.
Berikut beberapa pendekatan yang akan berhasil:
import pandas as pd
import numpy as np
df = pd.DataFrame({
'col_1': [0, 1, 2, 3],
'col_2': [4, 5, 6, 7]
})
Lalu salah satu dari berikut ini:
1) Tiga tugas dalam satu, menggunakan pembongkaran daftar:
df['column_new_1'], df['column_new_2'], df['column_new_3'] = [np.nan, 'dogs', 3]
2) dengan DataFrame
mudah memperluas satu baris agar sesuai dengan indeks, sehingga Anda dapat melakukan ini:
df[['column_new_1', 'column_new_2', 'column_new_3']] = pd.DataFrame([[np.nan, 'dogs', 3]], index=df.index)
3) Buat bingkai data sementara dengan kolom baru, kemudian gabungkan dengan bingkai data asli nanti:
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) Mirip dengan yang sebelumnya, tetapi menggunakan join
alih-alih concat
(mungkin kurang efisien):
df = df.join(pd.DataFrame(
[[np.nan, 'dogs', 3]],
index=df.index,
columns=['column_new_1', 'column_new_2', 'column_new_3']
))
5) Menggunakan dict adalah cara yang lebih "alami" untuk membuat bingkai data baru daripada dua sebelumnya, tetapi kolom baru akan diurutkan menurut abjad (setidaknya sebelum Python 3.6 atau 3.7 ):
df = df.join(pd.DataFrame(
{
'column_new_1': np.nan,
'column_new_2': 'dogs',
'column_new_3': 3
}, index=df.index
))
6) Gunakan .assign()
dengan beberapa argumen kolom.
Saya sangat menyukai varian ini pada jawaban @ zero, tetapi seperti yang sebelumnya, kolom baru akan selalu diurutkan menurut abjad, setidaknya dengan versi awal Python:
df = df.assign(column_new_1=np.nan, column_new_2='dogs', column_new_3=3)
7) Ini menarik (berdasarkan https://stackoverflow.com/a/44951376/3830997 ), tetapi saya tidak tahu kapan itu sepadan dengan masalahnya:
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) Pada akhirnya, sulit untuk mengalahkan tiga tugas terpisah:
df['column_new_1'] = np.nan
df['column_new_2'] = 'dogs'
df['column_new_3'] = 3
Catatan: banyak dari opsi ini telah tercakup dalam jawaban lain: Tambahkan beberapa kolom ke DataFrame dan atur sama dengan kolom yang ada , Apakah mungkin menambahkan beberapa kolom sekaligus ke DataFrame pandas? , Tambahkan beberapa kolom kosong ke pandas DataFrame
KeyError: "None of [Index(['column_new_1', 'column_new_2', 'column_new_3'], dtype='object')] are in the [columns]"