Bagaimana cara menambahkan kolom kosong ke bingkai data?


262

Apa cara termudah untuk menambahkan kolom kosong ke DataFrameobjek panda ? Yang terbaik yang saya temui adalah sesuatu seperti

df['foo'] = df.apply(lambda _: '', axis=1)

Apakah ada metode yang kurang sesat?


2
Apakah Anda benar-benar menginginkan kolom berisi string kosong atau lebih tepatnya N/A?
Filmor

Jawaban:


420

Jika saya mengerti dengan benar, tugas harus mengisi:

>>> import numpy as np
>>> import pandas as pd
>>> df = pd.DataFrame({"A": [1,2,3], "B": [2,3,4]})
>>> df
   A  B
0  1  2
1  2  3
2  3  4
>>> df["C"] = ""
>>> df["D"] = np.nan
>>> df
   A  B C   D
0  1  2   NaN
1  2  3   NaN
2  3  4   NaN

2
Jawaban ini baru saja membuat baris baru untuk saya.
logicbloke

@logicbloke dapatkah Anda memberikan contoh di mana ini terjadi?
craymichael

@craymichael Sudah lama tapi saya percaya saya memiliki kolom nomor indeks tanpa nama dan nama baris dan itu baru saja membuat baris baru di akhir.
logicbloke

1
Jika dfkosong, Anda mungkin ingin menggunakan df['new'] = pd.Series() (lihat jawaban saya di bawah)
Carsten

bagaimana cara menambahkan beberapa kolom kosong?
M. Mariscal

46

Untuk menambah jawaban DSM dan membangun pertanyaan terkait ini , saya membagi pendekatan menjadi dua kasus:

  • Menambahkan satu kolom: Cukup tetapkan nilai kosong ke kolom baru, mis df['C'] = np.nan

  • Menambahkan beberapa kolom: Saya sarankan menggunakan .reindex(columns=[...]) metode panda untuk menambahkan kolom baru ke indeks kolom dataframe. Ini juga berfungsi untuk menambahkan beberapa baris baru dengan .reindex(rows=[...]). Perhatikan bahwa versi Pandas yang lebih baru (v> 0,20) memungkinkan Anda menentukan axiskata kunci dan bukannya secara eksplisit menetapkan columnsatau rows.

Berikut ini contoh menambahkan beberapa kolom:

mydf = mydf.reindex(columns = mydf.columns.tolist() + ['newcol1','newcol2'])

atau

mydf = mydf.reindex(mydf.columns.tolist() + ['newcol1','newcol2'], axis=1)  # version > 0.20.0

Anda juga dapat selalu menyatukan kerangka data baru (kosong) ke kerangka data yang ada, tetapi itu tidak terasa seperti pythonic bagi saya :)


3
Contoh untuk version >= 0.20.0menghapus DataFrame dan menambahkan kolom baru sebagai baris. Contoh untuk version < 0.20.0karya yang bagus pada Versi Pandas0.24.1
Lalo

@emunsing Saat mencari jawaban untuk pertanyaan ini, saya akhirnya menemukan jawaban Anda bermanfaat. Pada awalnya, bagaimanapun, itu tidak bekerja untuk saya karena panda membutuhkan , axis=1di version = 0.25. Saya mencoba mengubah jawaban Anda untuk memasukkan versi yang diperbarui, tetapi saya ditolak oleh @kenlukas dan @il_raffa. Saya harap semua orang berjuang untuk memahami mengapa tanggapan Anda tidak bekerja untuk mereka - seperti saya - setidaknya datang di komentar ini.
Griff

@ Griff - Sekarang saya telah memperbarui jawaban saya untuk menjadi lebih akurat dan eksplisit tentang masalah kompatibilitas versi. Terima kasih telah menyoroti ini.
emunsing

35

solusi yang lebih sederhana adalah:

df = df.reindex(columns = header_list)                

di mana "header_list" adalah daftar tajuk yang ingin Anda tampilkan.

setiap header yang termasuk dalam daftar yang belum ditemukan dalam kerangka data akan ditambahkan dengan sel kosong di bawah ini.

jadi jika

header_list = ['a','b','c', 'd']

maka c dan d akan ditambahkan sebagai kolom dengan sel kosong


2
Lebih tepatnya, kolom akan ditambahkan dengan NaNs.
broccoli2000

19

Mulai dengan v0.16.0, DF.assign()dapat digunakan untuk menetapkan kolom baru ( tunggal / ganda ) ke a DF. Kolom-kolom ini dimasukkan dalam urutan abjad di akhir halaman DF.

Ini menjadi menguntungkan dibandingkan dengan penugasan sederhana dalam kasus-kasus di mana Anda ingin melakukan serangkaian operasi berantai langsung pada kerangka data yang dikembalikan.

Pertimbangkan DFcontoh yang sama yang ditunjukkan oleh @DSM:

df = pd.DataFrame({"A": [1,2,3], "B": [2,3,4]})
df
Out[18]:
   A  B
0  1  2
1  2  3
2  3  4

df.assign(C="",D=np.nan)
Out[21]:
   A  B C   D
0  1  2   NaN
1  2  3   NaN
2  3  4   NaN

Perhatikan bahwa ini mengembalikan salinan dengan semua kolom sebelumnya bersama dengan yang baru dibuat. Agar yang asli DFdimodifikasi sesuai, gunakan seperti:df = df.assign(...) karena tidak mendukung inplaceoperasi saat ini.


Apa itu tipe data untuk C? Saya mencoba menambahkan dengan mengulang daftar string. Tetapi tidak menggunakannya.
eleijonmarck

12

Saya suka:

df['new'] = pd.Series(dtype='your_required_dtype')

Jika Anda memiliki kerangka data kosong, solusi ini memastikan bahwa tidak ada baris baru yang hanya berisi NaN ditambahkan.

Jika dtypetidak ditentukan, versi Pandas yang lebih baru menghasilkan a DeprecationWarning.


5

jika Anda ingin menambahkan nama kolom dari daftar

df=pd.DataFrame()
a=['col1','col2','col3','col4']
for i in a:
    df[i]=np.nan

4

@ emunsing's jawabannya sangat keren untuk menambahkan beberapa kolom, tetapi saya tidak bisa membuatnya bekerja untuk saya di python 2.7. Sebaliknya, saya menemukan ini berfungsi:

mydf = mydf.reindex(columns = np.append( mydf.columns.values, ['newcol1','newcol2'])

1

Kode di bawah ini menjawab pertanyaan "Bagaimana cara menambahkan n jumlah kolom kosong ke kerangka data yang ada". Demi menjaga solusi untuk masalah serupa di satu tempat, saya menambahkannya di sini.

Pendekatan 1 (untuk membuat 64 kolom tambahan dengan nama kolom dari 1-64)

m = list(range(1,65,1)) 
dd=pd.DataFrame(columns=m)
df.join(dd).replace(np.nan,'') #df is the dataframe that already exists

Pendekatan 2 (untuk membuat 64 kolom tambahan dengan nama kolom dari 1-64)

df.reindex(df.columns.tolist() + list(range(1,65,1)), axis=1).replace(np.nan,'')

1

Anda dapat melakukan

df['column'] = None #This works. This will create a new column with None type
df.column = None #This will work only when the column is already present in the dataframe 

1

Satu dapat digunakan df.insert(index_to_insert_at, column_header, init_value)untuk menyisipkan kolom baru pada indeks tertentu.

cost_tbl.insert(1, "col_name", "") 

Pernyataan di atas akan menyisipkan Kolom kosong setelah kolom pertama.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.