Mengekstrak kolom tertentu yang dipilih ke DataFrame baru sebagai salinan

185

Saya memiliki DataFrame panda dengan 4 kolom dan saya ingin membuat DataFrame baru yang hanya memiliki tiga kolom. Pertanyaan ini mirip dengan: Mengekstrak kolom tertentu dari bingkai data tetapi untuk panda tidak R. Kode berikut ini tidak berfungsi, menimbulkan kesalahan, dan tentu saja bukan cara pandasnic untuk melakukannya.

import pandas as pd
old = pd.DataFrame({'A' : [4,5], 'B' : [10,20], 'C' : [100,50], 'D' : [-30,-50]})
new = pd.DataFrame(zip(old.A, old.C, old.D)) # raises TypeError: data argument can't be an iterator 

Apa cara pandasnic untuk melakukannya?

SpeedCoder5
sumber

Jawaban:

359

Ada cara untuk melakukan ini dan itu sebenarnya terlihat mirip dengan R

new = old[['A', 'C', 'D']].copy()

Di sini Anda hanya memilih kolom yang Anda inginkan dari bingkai data asli dan membuat variabel untuk itu. Jika Anda ingin memodifikasi kerangka data baru, Anda mungkin ingin menggunakannya .copy()untuk menghindari a SettingWithCopyWarning.

Metode alternatif adalah menggunakan filteryang akan membuat salinan secara default:

new = old.filter(['A','B','D'], axis=1)

Akhirnya, tergantung pada jumlah kolom dalam kerangka data asli Anda, mungkin lebih ringkas untuk mengekspresikan ini menggunakan a drop(ini juga akan membuat salinan secara default):

new = old.drop('B', axis=1)
Johnchase
sumber
20
Hati-hati jika hanya menyalin satu kolom: Di old[['A']].copy(), tanda kurung ganda diperlukan untuk membuat bingkai data baru. Perhatikan bahwa old['A'].copy()hanya akan membuat Seri.
intotecho
19

Cara termudah adalah

new = old[['A','C','D']]

.

stidmatt
sumber
3
Ini bukan membuat salinan kecuali Anda secara eksplisit memanggil .copy ()
Sylvain
salinan ini secara default.
Nguai al
1
@Nguaial perilaku pengindeksan sederhana tidak ditentukan. Anda tidak akan tahu apakah Anda mendapatkan salinan atau tampilan. Lihat dokumentasi untuk detail lebih lanjut: pandas.pydata.org/pandas-docs/stable/user_guide/…
Ole Fass
8

Cara lain yang lebih sederhana adalah:

new = pd.DataFrame([old.A, old.B, old.C]).transpose()

di mana old.column_nameakan memberi Anda seri. Buat daftar semua seri kolom yang ingin Anda pertahankan dan serahkan ke konstruktor DataFrame. Kita perlu melakukan transpos untuk menyesuaikan bentuk.

In [14]:pd.DataFrame([old.A, old.B, old.C]).transpose()
Out[14]: 
   A   B    C
0  4  10  100
1  5  20   50
Memukul
sumber
berfungsi, tetapi tidak jika nama_kolom memiliki karakter khusus.
jimh
oh tidak memikirkan itu
Hit
3

Bentuk fungsional generik

def select_columns(data_frame, column_names):
    new_frame = data_frame.loc[:, column_names]
    return new_frame

Khusus untuk masalah Anda di atas

selected_columns = ['A', 'C', 'D']
new = select_columns(old, selected_columns)
Deslin Naidoo
sumber
2

Jika Anda ingin memiliki bingkai data baru maka:

import pandas as pd
old = pd.DataFrame({'A' : [4,5], 'B' : [10,20], 'C' : [100,50], 'D' : [-30,-50]})
new=  old[['A', 'C', 'D']]
Kebohongan
sumber
1

Sejauh yang saya tahu, Anda tidak perlu menentukan sumbu saat menggunakan fungsi filter.

new = old.filter(['A','B','D'])

mengembalikan dataframe yang sama dengan

new = old.filter(['A','B','D'], axis=1)
Ellen
sumber
1

kolom menurut indeks:

# selected column index: 1, 6, 7
new = old.iloc[: , [1, 6, 7]].copy() 
sailfish009
sumber