Pandalar veri çerçevesinden bir satır listesi nasıl bırakılır?


259

Bir dataframe df var:

>>> df
                  sales  discount  net_sales    cogs
STK_ID RPT_Date                                     
600141 20060331   2.709       NaN      2.709   2.245
       20060630   6.590       NaN      6.590   5.291
       20060930  10.103       NaN     10.103   7.981
       20061231  15.915       NaN     15.915  12.686
       20070331   3.196       NaN      3.196   2.710
       20070630   7.907       NaN      7.907   6.459

Sonra bir listede belirtilen belirli sıra numaralarına sahip satırları bırakmak istiyorum, [1,2,4],sonra burada kaldı varsayalım :

                  sales  discount  net_sales    cogs
STK_ID RPT_Date                                     
600141 20060331   2.709       NaN      2.709   2.245
       20061231  15.915       NaN     15.915  12.686
       20070630   7.907       NaN      7.907   6.459

Bunu nasıl veya hangi işlev yapabilir?


Sadece netleştirmek için, bu soru spesifik endeks değerleri ile .. [1,2,4] kullanımları sıraları işaret edecek olduğu satırları bırakarak hakkındadır arta kalan bırakarak sonra. Aşağıda bunu yapan cevaplar var.
simya

Yanıtlar:


387

DataFrame.drop kullanın ve bir dizi dizin etiketi iletin :

In [65]: df
Out[65]: 
       one  two
one      1    4
two      2    3
three    3    2
four     4    1


In [66]: df.drop(df.index[[1,3]])
Out[66]: 
       one  two
one      1    4
three    3    2

18
+1 Ayrıca, son satırı düşürme df.drop (df.tail (1) .index)
Nasser Al-Wohaibi

15
Bu yanıt yalnızca df.index.unique (), bir Pandas DataFrame için bir gereklilik olmayan df.index ile aynı ise işe yarar. Df.index değerlerinin benzersiz olduğu garanti edilmediğinde kimsenin bir çözümü var mı?
J Jones

2
bu, dizin adının kendisini dizine eklemenize izin vermez
ingrid

45
Örnekler, açık olmak istiyorsanız, lütfen satırlar ve sütunlar için aynı dizeleri kullanmayın. Eşyalarını gerçekten bilenler için bu iyi. Öğrenmeye çalışanlar için sinir bozucu.
Mart'ta gseattle

2
piton için yeni gelenler: Bu satırları bırakın ve aynı dataframe (InPlace) bunları kaydetmek isterseniz de eklemek gerekir notu axis=0(0 = satır, 1 = sütunlar) ve inplace=Trueolduğu gibi df.drop(df.index[[1,3]], axis=0, inplace=True). @mezzanaccio, özellikle hangi dizinleri değiştirmek istediğinizi biliyorsanız (ve ayrıca 0 - n örneğinizi kullanarak):df.drop(df.index[range(0, n)], axis=0, inplace=True)
mrbTT


47

DataFrame çok büyükse ve bırakılacak satır sayısı da büyükse, dizine göre basit bırakma df.drop(df.index[])çok fazla zaman alır.

Benim durumumda, çok dizinli bir DataFrame ile yüzen olduğunu 100M rows x 3 colsve 10kondan satırları kaldırmak gerekiyor. Bulduğum en hızlı yöntem take, geri kalan satırlara oldukça mantıklı bir şekilde .

Izin indexes_to_dropvermek ( [1, 2, 4]soruda) bırakılacak bir konum dizinleri dizisi olsun .

indexes_to_keep = set(range(df.shape[0])) - set(indexes_to_drop)
df_sliced = df.take(list(indexes_to_keep))

Benim durumumda bu aldı 20.5s, basit çok fazla bellek df.dropaldı 5min 27sve tüketti. Sonuçta elde edilen DataFrame aynıdır.


43

Ayrıca geçebilir DataFrame.drop etiketi kendisi (yerine dizin etiket Seri):

In[17]: df
Out[17]: 
            a         b         c         d         e
one  0.456558 -2.536432  0.216279 -1.305855 -0.121635
two -1.015127 -0.445133  1.867681  2.179392  0.518801

In[18]: df.drop('one')
Out[18]: 
            a         b         c         d         e
two -1.015127 -0.445133  1.867681  2.179392  0.518801

Şuna eşittir:

In[19]: df.drop(df.index[[0]])
Out[19]: 
            a         b         c         d         e
two -1.015127 -0.445133  1.867681  2.179392  0.518801

1
df.drop (df.index [0]) de çalışır. yani, çift square_brackets gerek yok (en az panda 0.18.1 ile)
tagoma

23

Bunu daha basit bir şekilde çözdüm - sadece 2 adımda.

Adım 1: Öncelikle istenmeyen satır / veri içeren bir veri çerçevesi oluşturun.

Adım 2: Satırları orijinal veri çerçevesinden bırakmak için bu istenmeyen veri çerçevesinin dizinini kullanın.

Misal:

Diyelim ki bir tamsayı olan 'Yaş' dahil olmak üzere çok sayıda sütun içeren bir veri çerçevesi df'niz var. Şimdi 'Yaş' olan tüm satırları negatif sayı olarak bırakmak istediğinizi varsayalım.

Adım 1: df_age_negative = df [df ['Yaş'] <0]

Adım 2: df = df.drop (df_age_negative.index, eksen = 0)

Umarım bu çok daha basittir ve size yardımcı olur.


1
+1, ilkinden farklı bir sütun seçerek bir satırı nasıl kaldıracağınızı söyleyen tek cevap budur.
Alejo Bernardin

10

Dizin diyelim bir satır bırakmak istiyorsanız x, ben aşağıdakileri yapmak:

df = df[df.index != x]

Birden çok indeks (bu endeksler listede olduğunu söylemek) bırakmak istiyorum unwanted_indices, ben yapardı:

desired_indices = [i for i in len(df.index) if i not in unwanted_indices]
desired_df = df.iloc[desired_indices]

6

İşte biraz özel bir örnek, göstermek istiyorum. Bazı satırlarınızda yinelenen birçok girişiniz olduğunu varsayalım. Dize girişleriniz varsa, bırakılacak tüm dizinleri bulmak için dize yöntemlerini kolayca kullanabilirsiniz.

ind_drop = df[df['column_of_strings'].apply(lambda x: x.startswith('Keyword'))].index

Ve şimdi bu satırları dizinlerini kullanarak bırakmak

new_df = df.drop(ind_drop)

3

@ Theodros-zelleke'nin cevabına yaptığı bir yorumda @ j-jones, dizin benzersiz değilse ne yapılacağını sordu. Böyle bir durumla uğraşmak zorunda kaldım. Ne yapmadan önce drop(), bir la: dizinindeki kopyaları yeniden adlandırmak oldu :

dropped_indexes = <determine-indexes-to-drop>
df.index = rename_duplicates(df.index)
df.drop(df.index[dropped_indexes], inplace=True)

Burada rename_duplicates()tanımladığım ve indeks öğelerinden geçen ve kopyaları yeniden adlandıran bir fonksiyon. Ben aynı adlandırma deseni kullanılmış pd.read_csv()yani sütunlarda kullanımlar, "%s.%d" % (name, count)nerede namesıranın adıdır ve countdaha önce meydana geldi kaç katıdır.


1

Yukarıda açıklandığı gibi boole'den endeksin belirlenmesi örn.

df[df['column'].isin(values)].index

bu yöntemi kullanarak dizini belirlemekten daha fazla bellek yoğun olabilir

pd.Index(np.where(df['column'].isin(values))[0])

böyle uygulandı

df.drop(pd.Index(np.where(df['column'].isin(values))[0]), inplace = True)

Bu yöntem, büyük veri çerçeveleri ve sınırlı bellekle uğraşırken kullanışlıdır.


0

Satırı bırakmak için yalnızca Dizin bağımsız değişkenini kullanın: -

df.drop(index = 2, inplace = True)

Birden çok satır için: -

df.drop(index=[1,3], inplace = True)

0

Örnek bir veri çerçevesi düşünün

df =     
index    column1
0           00
1           10
2           20
3           30

2. ve 3. dizin satırlarını bırakmak istiyoruz.

Yaklaşım 1:

df = df.drop(df.index[2,3])
 or 
df.drop(df.index[2,3],inplace=True)
print(df)

df =     
index    column1
0           00
3           30

 #This approach removes the rows as we wanted but the index remains unordered

Yaklaşım 2

df.drop(df.index[2,3],inplace=True,ignore_index=True)
print(df)
df =     
index    column1
0           00
1           30
#This approach removes the rows as we wanted and resets the index. 
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.