Bagaimana cara menjatuhkan daftar baris dari bingkai data Pandas?

258

Saya memiliki dataframe df:

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

Lalu saya ingin drop baris dengan nomor urut tertentu yang ditunjukkan dalam daftar, anggap di sini [1,2,4],kemudian dibiarkan:

                  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

Bagaimana atau fungsi apa yang bisa melakukan itu?

bigbug
sumber
hanya untuk memperjelas, pertanyaan ini adalah tentang menjatuhkan baris dengan nilai indeks tertentu .. penggunaannya [1,2,4] adalah untuk menunjuk ke baris yang tersisa setelah dijatuhkan. Ada jawaban di bawah ini yang melakukan ini.
alkimia

Jawaban:

386

Gunakan DataFrame.drop dan berikan serangkaian label indeks:

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
Theodros Zelleke
sumber
18
+1 Selain itu, Menjatuhkan baris terakhir df.drop (df.tail (1) .index)
Nasser Al-Wohaibi
15
Jawaban ini hanya berfungsi jika df.index.unique () sama dengan df.index, yang bukan merupakan persyaratan untuk Pandaf DataFrame. Adakah yang punya solusi ketika nilai df.index tidak dijamin unik?
J Jones
2
ini tidak memungkinkan Anda untuk mengindeks pada nama indeks itu sendiri
ingrid
45
Orang-orang, dalam contoh, jika Anda ingin menjadi jelas, jangan gunakan string yang sama untuk baris dan kolom. Itu bagus untuk mereka yang sudah tahu barang-barang mereka. Membuat frustrasi untuk mereka yang mencoba belajar.
gseattle
2
pendatang baru ke python: perhatikan bahwa jika Anda ingin menjatuhkan baris-baris ini dan menyimpannya dalam kerangka data yang sama (inplace) Anda juga perlu menambahkan axis=0(0 = baris, 1 = kolom) dan inplace=Trueseperti pada df.drop(df.index[[1,3]], axis=0, inplace=True). @mezzanaccio, jika Anda secara khusus tahu indeks mana yang ingin Anda ganti (dan juga menggunakan contoh 0 to n):df.drop(df.index[range(0, n)], axis=0, inplace=True)
mrbTT
47

Jika DataFrame sangat besar, dan jumlah baris untuk turun juga besar, maka penurunan sederhana menurut indeks df.drop(df.index[])membutuhkan terlalu banyak waktu.

Dalam kasus saya, saya memiliki DataFrame multi-diindeks mengapung 100M rows x 3 cols, dan saya perlu menghapus 10kbaris dari itu. Metode tercepat yang saya temukan adalah, cukup berlawanan dengan intuisi, ke takebaris yang tersisa.

Membiarkan indexes_to_dropmenjadi array indeks posisi untuk dijatuhkan ( [1, 2, 4]dalam pertanyaan).

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

Dalam kasus saya ini memakan waktu 20.5s, sementara yang sederhana df.dropmengambil 5min 27sdan menghabiskan banyak memori. DataFrame yang dihasilkan adalah sama.

Dennis Golomazov
sumber
43

Anda juga dapat lolos ke DataFrame.drop yang label sendiri (bukan Series label index):

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

Yang setara dengan:

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
danielhadar
sumber
1
df.drop (df.index [0]) juga berfungsi. maksud saya, tidak perlu double square_brackets (dengan panda 0.18.1, setidaknya)
tagoma
23

Saya memecahkan ini dengan cara yang lebih sederhana - hanya dalam 2 langkah.

Langkah 1: Pertama bentuk bingkai data dengan baris / data yang tidak diinginkan.

Langkah 2: Gunakan indeks kerangka data yang tidak diinginkan ini untuk melepaskan baris dari kerangka data asli.

Contoh:

Misalkan Anda memiliki dataframe df yang banyak kolom termasuk 'Umur' yang merupakan bilangan bulat. Sekarang katakanlah Anda ingin menghapus semua baris dengan 'Umur' sebagai angka negatif.

Langkah 1: df_age_negative = df [df ['Age'] <0]

Langkah 2: df = df.drop (df_age_negative.index, axis = 0)

Semoga ini lebih sederhana dan membantu Anda.

Krishnaprasad Challuru
sumber
1
+1, ini adalah satu-satunya jawaban yang memberi tahu Anda cara menghapus baris memilih kolom yang berbeda dari yang pertama.
Alejo Bernardin
10

Jika saya ingin menjatuhkan baris yang memiliki misalkan indeks x, saya akan melakukan hal berikut:

df = df[df.index != x]

Jika saya ingin menjatuhkan beberapa indeks (misalkan indeks ini ada dalam daftar unwanted_indices), saya akan melakukan:

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

Berikut adalah contoh spesifik, saya ingin menunjukkan. Katakanlah Anda memiliki banyak entri duplikat di beberapa baris Anda. Jika Anda memiliki entri string, Anda dapat dengan mudah menggunakan metode string untuk menemukan semua indeks untuk dijatuhkan.

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

Dan sekarang untuk menjatuhkan baris-baris itu menggunakan indeks mereka

new_df = df.drop(ind_drop)
maya-matematika
sumber
3

Dalam komentar ke jawaban @ theodros-zelleke, @ j-jones bertanya tentang apa yang harus dilakukan jika indeks tidak unik. Saya harus menghadapi situasi seperti itu. Apa yang saya lakukan adalah mengganti nama duplikat dalam indeks sebelum saya menelepon drop(), a la:

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

di mana rename_duplicates()fungsi yang saya definisikan melalui elemen indeks dan mengganti nama duplikat. Saya menggunakan pola penggantian nama yang sama seperti yang pd.read_csv()digunakan pada kolom, yaitu "%s.%d" % (name, count), di mana namenama baris dan countberapa kali itu terjadi sebelumnya.

mepstein
sumber
1

Menentukan indeks dari boolean seperti yang dijelaskan di atas misalnya

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

memori bisa lebih intensif daripada menentukan indeks menggunakan metode ini

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

diterapkan seperti itu

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

Metode ini berguna saat berurusan dengan kerangka data yang besar dan memori yang terbatas.

Adam Zeldin
sumber
0

Gunakan hanya Indeks arg untuk melepas baris: -

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

Untuk beberapa baris: -

df.drop(index=[1,3], inplace = True)
kamran kausar
sumber
0

Pertimbangkan contoh bingkai data

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

kami ingin menghapus baris indeks 2 dan 3.

Pendekatan 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

Pendekatan 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. 
Daratan
sumber