Seçilen sütunları yeni DataFrame'e kopya olarak çıkarma


185

4 Sütunlu bir panda DataFrame var ve yalnızca üç sütun içeren yeni bir DataFrame oluşturmak istiyorum . Bu soru şuna benzer: Belirli bir veri çerçevesinden belirli sütunları ayıklamak, ancak pandalar için R değil. Aşağıdaki kod çalışmaz, bir hata oluşturur ve bunu yapmanın pandatik yolu kesinlikle değildir.

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 

Bunu yapmanın pandalı yolu nedir?

Yanıtlar:


359

Bunu yapmanın bir yolu var ve aslında R'ye benziyor

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

Burada sadece orijinal veri çerçevesinden istediğiniz sütunları seçiyor ve bunlar için bir değişken oluşturuyorsunuz. Yeni veri çerçevesini hiç değiştirmek istiyorsanız, büyük olasılıkla .copy()a SettingWithCopyWarning.

Alternatif bir yöntem kullanmak filter, varsayılan olarak bir kopya oluşturur:

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

Son olarak, orijinal veri çerçevenizdeki sütun sayısına bağlı olarak, bunu bir a kullanarak ifade etmek daha özlü olabilir drop(bu da varsayılan olarak bir kopya oluşturur):

new = old.drop('B', axis=1)

20
Yalnızca bir sütunu kopyalarken dikkat old[['A']].copy()edilmesi gereken nokta: Yeni bir veri çerçevesi oluşturmak için çift köşeli parantez gereklidir. old['A'].copy()Yalnızca bir Seri oluşturacağını unutmayın .
intotecho


8

Başka bir basit yol şöyle görünüyor:

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

nerede old.column_namesize bir dizi verecektir. Saklamak istediğiniz tüm sütun serilerinin bir listesini yapın ve DataFrame yapıcısına iletin. Şekli ayarlamak için bir devrik yapmalıyız.

In [14]:pd.DataFrame([old.A, old.B, old.C]).transpose()
Out[14]: 
   A   B    C
0  4  10  100
1  5  20   50

sütun_adı özel karakterler içeriyorsa çalışmaz.
jimh

oh bunu düşünmemişti
vur

3

Genel fonksiyonel form

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

Yukarıdaki sorununuza özel

selected_columns = ['A', 'C', 'D']
new = select_columns(old, selected_columns)

2

Yeni bir veri çerçevesine sahip olmak istiyorsanız:

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

Anlayabildiğim kadarıyla, filtre işlevini kullanırken ekseni belirtmeniz gerekmez.

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

ile aynı veri çerçevesini döndürür

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

1

dizine göre sütunlar:

# selected column index: 1, 6, 7
new = old.iloc[: , [1, 6, 7]].copy() 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.