2017-03-20 41 views
8

:Sütun verilerinin uzunluğuna bağlı olarak pandalar veri dizisinden bir satır nasıl kaldırılır? Aşağıdaki <code>pandas.DataFframe</code> yılında

df = 
    alfa beta ceta 
    a,b,c c,d,e g,e,h 
    a,b  d,e,f g,h,k 
    j,k  c,k,l f,k,n 

Nasıl alfa için sütun değerleri 2'den fazla unsurları bulunduğu satırları düşmesi? Bu, uzunluk fonksiyonunu kullanarak yapılabilir, biliyorum ama belirli bir cevap bulamıyorum.

alfa beta ceta 
1 a,b d,e,f g,h,k 
2 j,k c,k,l f,k,n 

cevap

4

Sen pandas.DataFrame.apply()

print(df[df['alfa'].apply(lambda x: len(x.split(',')) < 3)]) 

verir kullanarak sırayla her satıra o sınavı yapabilir? expand=True kullanma

df = df[df['alpha'].str.split(',', expand=True)[2].isnull()] 

listedeki her madde için bir sütun içeren yeni dataframe oluşturur. Listede üç veya daha fazla öğe varsa, üçüncü sütunda boş olmayan bir değer olur.

Bu yaklaşımla ilgili bir sorun, listelerden hiçbirinin üç veya daha fazla öğeye sahip olmaması durumunda, [2] numaralı sütunun seçilmesi KeyError neden olacaktır. Buna dayanarak, @Stephen Rauch tarafından yayınlanan çözümü kullanmak daha güvenlidir.

2

Nasıl da şu:

df = df[['alfa'].str.split(',').map(len) < 3] 
2

DF verilen alt kümesi en-az iki yolu bulunmaktadır:

df[df['alfa'].str.split(",").str.len().lt(3)] 

2) virgül sayısını: virgül ayırıcıdaki

1) Split ve daha sonra elde edilen list uzunluğunu hesaplamak ve son karakteri hesaba sonuca 1 ekleyin:

df[df['alfa'].str.count(",").add(1).lt(3)] 

Hem üretmek:

enter image description here

3

Bu @ NickilMaveli en cevabın numpy versiyonudur.

mask = np.core.defchararray.count(df.alfa.values.astype(str), ',') <= 1 
pd.DataFrame(df.values[mask], df.index[mask], df.columns) 

    alfa beta ceta 
1 a,b d,e,f g,h,k 
2 j,k c,k,l f,k,n 

naif zamanlama İşte

enter image description here

1

hatırlamak ve hala Pandalar "kanayan kalbi" olduğunu DataFrame kucaklayan en kolay bir seçenektir:

1) Veritabanında yeni bir sütun oluşturun. uzunluğu için bir değer inci:

df['length'] = df.alfa.str.len() 

2) Endeksi yeni kolon kullanılarak:

df = df[df.length < 3] 

Ardından bu durumda gerçekten alakalı olmayan yukarıdaki zamanlamalar için karşılaştırma verileri çok olduğu gibi

adım 1:

%timeit df['length'] = df.alfa.str.len() 
genellikle küçük ve size iş akışını kesmek zorunda şeyin nasıl hatırlamak gidip değiliz kadar olası daha az önemlidir

Döngü başına 359 µs ± 6.83 µs (ortalama ± std. dev. 7 çalışır 1000 adım 2

) her döngüler. Döngü başına 76.9 us ±

df = df[df.length < 3] 

627 us (standart sapma ortalama ± 7 ishal, 1000 halkalarını her biri)

iyi. haber, boyut büyüdüğünde, zamanın doğrusal olarak büyümediği. Örneğin, 30.000 satırlık veriyle aynı işlemi yapmak yaklaşık 3 ms (10,000x veri, 3x hız artışı) alır. Pandalar DataFrame bir tren gibidir, onu almak için enerji harcar (mutlak mukayese altında küçük şeyler için pek iyi değildir, fakat nesnel olarak çok küçük bir şey yapmaz ... küçük veri şeylerinde olduğu gibi).