Saya baru mengenal panda dan mencoba mencari cara untuk menambahkan beberapa kolom ke panda secara bersamaan. Setiap bantuan di sini dihargai. Idealnya saya ingin melakukan ini dalam satu langkah daripada beberapa langkah berulang ...
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...
KeyError: "None of [Index(['column_new_1', 'column_new_2', 'column_new_3'], dtype='object')] are in the [columns]"
Jawaban:
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:
Lalu salah satu dari berikut ini:
1) Tiga tugas dalam satu, menggunakan pembongkaran daftar:
2) dengan
DataFrame
mudah memperluas satu baris agar sesuai dengan indeks, sehingga Anda dapat melakukan ini:3) Buat bingkai data sementara dengan kolom baru, kemudian gabungkan dengan bingkai data asli nanti:
4) Mirip dengan yang sebelumnya, tetapi menggunakan
join
alih-alihconcat
(mungkin kurang efisien):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 ):
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:
7) Ini menarik (berdasarkan https://stackoverflow.com/a/44951376/3830997 ), tetapi saya tidak tahu kapan itu sepadan dengan masalahnya:
8) Pada akhirnya, sulit untuk mengalahkan tiga tugas terpisah:
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
sumber
.reindex
) akan mengubah indeks bingkai data? Mengapa seseorang ingin mengubah indeks yang tidak perlu saat menambahkan kolom kecuali itu adalah tujuan eksplisit ....reindex()
digunakan dengancolumns
argumen, jadi hanya mengubah kolom "indeks" (nama). Itu tidak mengubah indeks baris.OrderedDict
: misalnya,df.join(pd.DataFrame( OrderedDict([('column_new_2', 'dogs'),('column_new_1', np.nan),('column_new_3', 3)]), index=df.index ))
df = pd.DataFrame({'before': [1, 2, 3], 'after': [4, 5, 6]})
vs.df = pd.DataFrame(OrderedDict([('before', [1, 2, 3]), ('after', [4, 5, 6])])
join
, pastikan Anda tidak memiliki duplikat di indeks Anda (atau gunakan yangreset_index
pertama). Mungkin menghemat beberapa jam debugging.Anda bisa menggunakan
assign
dikt nama dan nilai kolom.sumber
df.assign(**{'col_new_1': np.nan}).assign(**{'col2_new_2': 'dogs'}).assign(**{'col3_new_3': 3})
df.assign(col_new_1=np.nan, col2_new_2='dogs', col3_new_3=3)
. Ini menjaga ketertiban.Dengan penggunaan concat :
Tidak terlalu yakin dengan apa yang ingin Anda lakukan
[np.nan, 'dogs',3]
. Mungkin sekarang mengaturnya sebagai nilai default?sumber
penggunaan pemahaman daftar,
pd.DataFrame
danpd.concat
sumber
jika menambahkan banyak kolom yang hilang (a, b, c, ....) dengan nilai yang sama, di sini 0, saya melakukan ini:
Ini didasarkan pada varian kedua dari jawaban yang diterima.
sumber
Hanya ingin menunjukkan opsi2 itu dalam jawaban @Matthias Fripp
sudah didokumentasikan dalam dokumentasi pandas sendiri http://pandas.pydata.org/pandas-docs/stable/indexing.html#basics
sumber
pd.DataFrame([[np.nan, 'dogs', 3]], index=df.index)
mereplikasi satu baris yang diberikan untuk membuat keseluruhan kerangka data dengan panjang yang sama dengan indeks.Jika Anda hanya ingin menambahkan kolom baru yang kosong, indeks ulang akan melakukan pekerjaan itu
contoh kode lengkap
jika tidak, carilah jawaban nol dengan assign
sumber
Saya tidak nyaman menggunakan "Indeks" dan seterusnya ... bisa muncul seperti di bawah ini
sumber