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?

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)

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


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

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)

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']]

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)

1

kolom menurut indeks:

# selected column index: 1, 6, 7
new = old.iloc[: , [1, 6, 7]].copy() 
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.