Cara menggunakan PANDAS.DROP pada Python

Fungsi Pandas DataFrame drop() menjatuhkan label tertentu dari baris dan kolom. Fungsi drop() menghapus baris dan kolom baik dengan mendefinisikan nama label dan sumbu yang sesuai atau dengan menyebutkan nama indeks atau kolom secara langsung. Saat kami menggunakan multi-indeks, label pada level yang berbeda dihapus dengan menyebutkan levelnya. Ini digunakan untuk menjatuhkan bagian dari bingkai data yang tidak kita inginkan dalam analisis kita.



Memahami penurunan DataFrame Panda ()

Pandas DataFrames adalah Struktur Data yang berisi:

  1. Data diselenggarakan di dua dimensi , baris dan kolom
  2. Label yang sesuai dengan baris dan kolom

Ada banyak cara untuk membuat Pandas DataFrame. Dalam kebanyakan kasus, Anda akan menggunakan konstruktor DataFrame dan memberikan data, label, dan info lainnya. Anda dapat meneruskan data sebagai daftar dua dimensi, tuple, atau array NumPy. Anda juga dapat memberikannya sebagai kamus atau contoh Seri Pandas.



api istirahat panggilan javascript

Mari kita buat Pandas DataFrame menggunakan Dictionary.

import pandas as pd import numpy as np ## Importing numpy for NaN values ## Creating dataset using dictionary dataset = { 'Name': ['Rohit', 'Arun', 'Sohit', 'Arun', 'Shubh'], 'Roll no': ['01', '02', '03', '04', np.nan], 'Maths': ['93', '63', np.nan, '94', '83'], 'Science': ['88', np.nan, '66', '94', np.nan], 'English': ['93', '74', '84', '92', '87']} row_labels = ['a', 'b', 'c', 'd', 'e'] df = pd.DataFrame(data = dataset, index = row_labels) print('DataFrame: ', df)

#panda #python



appdividend.com

Fungsi Pandas DataFrame drop() menjatuhkan label tertentu dari baris dan kolom. Fungsi drop() menghapus baris dan kolom baik dengan mendefinisikan nama label dan sumbu yang sesuai atau dengan menyebutkan nama indeks atau kolom secara langsung.

TL; DR

Banyak upaya untuk menemukan solusi yang sedikit lebih efisien. Sulit untuk membenarkan kerumitan yang ditambahkan sambil mengorbankan kesederhanaan df.drop(dlst, 1, errors='ignore')

df.reindex_axis(np.setdiff1d(df.columns.values, dlst), 1)

Pembukaan
Menghapus kolom secara semantik sama dengan memilih kolom lainnya. Saya akan menunjukkan beberapa metode tambahan untuk dipertimbangkan. 

Saya juga akan fokus pada solusi umum menghapus beberapa kolom sekaligus dan memungkinkan upaya untuk menghapus kolom yang tidak ada. 

Menggunakan solusi ini bersifat umum dan akan berfungsi untuk kasus sederhana juga.


Mempersiapkan
Pertimbangkan pd.DataFramedf dan daftar untuk menghapus dlst

df = pd.DataFrame(dict(Zip('ABCDEFGHIJ', range(1, 11))), range(3))
dlst = list('HIJKLM')

df

   A  B  C  D  E  F  G  H  I   J
0  1  2  3  4  5  6  7  8  9  10
1  1  2  3  4  5  6  7  8  9  10
2  1  2  3  4  5  6  7  8  9  10

dlst

['H', 'I', 'J', 'K', 'L', 'M']

Hasilnya harus seperti:

df.drop(dlst, 1, errors='ignore')

   A  B  C  D  E  F  G
0  1  2  3  4  5  6  7
1  1  2  3  4  5  6  7
2  1  2  3  4  5  6  7

Karena saya menyamakan menghapus kolom untuk memilih kolom lainnya, saya akan memecahnya menjadi dua jenis:

  1. Pemilihan label
  2. Temukan Boolean

Pemilihan Label

Kita mulai dengan membuat daftar/array label yang mewakili kolom yang ingin kita pertahankan dan tanpa kolom yang ingin kita hapus.

  1. df.columns.difference(dlst)

    Index(['A', 'B', 'C', 'D', 'E', 'F', 'G'], dtype='object')
    
  2. np.setdiff1d(df.columns.values, dlst)

    array(['A', 'B', 'C', 'D', 'E', 'F', 'G'], dtype=object)
    
  3. df.columns.drop(dlst, errors='ignore')

    Index(['A', 'B', 'C', 'D', 'E', 'F', 'G'], dtype='object')
    
  4. list(set(df.columns.values.tolist()).difference(dlst))

    # does not preserve order
    ['E', 'D', 'B', 'F', 'G', 'A', 'C']
    
  5. [x for x in df.columns.values.tolist() if x not in dlst]

    ['A', 'B', 'C', 'D', 'E', 'F', 'G']
    

Kolom dari Label
.__ Demi membandingkan proses seleksi, asumsikan:

 cols = [x for x in df.columns.values.tolist() if x not in dlst]

Maka kita bisa mengevaluasi 

  1. df.loc[:, cols]
  2. df[cols]
  3. df.reindex(columns=cols)
  4. df.reindex_axis(cols, 1)

Yang semuanya dievaluasi menjadi:

   A  B  C  D  E  F  G
0  1  2  3  4  5  6  7
1  1  2  3  4  5  6  7
2  1  2  3  4  5  6  7

Boolean Slice

Kita dapat membuat array/daftar boolean untuk diiris

  1. ~df.columns.isin(dlst)
  2. ~np.in1d(df.columns.values, dlst)
  3. [x not in dlst for x in df.columns.values.tolist()]
  4. (df.columns.values[:, None] != dlst).all(1)

Kolom dari Boolean
.__ Demi perbandingan 

bools = [x not in dlst for x in df.columns.values.tolist()]
  1. df.loc[: bools]

Yang semuanya dievaluasi menjadi:

   A  B  C  D  E  F  G
0  1  2  3  4  5  6  7
1  1  2  3  4  5  6  7
2  1  2  3  4  5  6  7

Pengaturan Waktu yang Kuat 

Fungsi 

setdiff1d = lambda df, dlst: np.setdiff1d(df.columns.values, dlst)
difference = lambda df, dlst: df.columns.difference(dlst)
columndrop = lambda df, dlst: df.columns.drop(dlst, errors='ignore')
setdifflst = lambda df, dlst: list(set(df.columns.values.tolist()).difference(dlst))
comprehension = lambda df, dlst: [x for x in df.columns.values.tolist() if x not in dlst]

loc = lambda df, cols: df.loc[:, cols]
slc = lambda df, cols: df[cols]
ridx = lambda df, cols: df.reindex(columns=cols)
ridxa = lambda df, cols: df.reindex_axis(cols, 1)

isin = lambda df, dlst: ~df.columns.isin(dlst)
in1d = lambda df, dlst: ~np.in1d(df.columns.values, dlst)
comp = lambda df, dlst: [x not in dlst for x in df.columns.values.tolist()]
brod = lambda df, dlst: (df.columns.values[:, None] != dlst).all(1)

Pengujian 

res1 = pd.DataFrame(
    index=pd.MultiIndex.from_product([
        'loc slc ridx ridxa'.split(),
        'setdiff1d difference columndrop setdifflst comprehension'.split(),
    ], names=['Select', 'Label']),
    columns=[10, 30, 100, 300, 1000],
    dtype=float
)

res2 = pd.DataFrame(
    index=pd.MultiIndex.from_product([
        'loc'.split(),
        'isin in1d comp brod'.split(),
    ], names=['Select', 'Label']),
    columns=[10, 30, 100, 300, 1000],
    dtype=float
)

res = res1.append(res2).sort_index()

dres = pd.Series(index=res.columns, name='drop')

for j in res.columns:
    dlst = list(range(j))
    cols = list(range(j // 2, j + j // 2))
    d = pd.DataFrame(1, range(10), cols)
    dres.at[j] = timeit('d.drop(dlst, 1, errors="ignore")', 'from __main__ import d, dlst', number=100)
    for s, l in res.index:
        stmt = '{}(d, {}(d, dlst))'.format(s, l)
        setp = 'from __main__ import d, dlst, {}, {}'.format(s, l)
        res.at[(s, l), j] = timeit(stmt, setp, number=100)

rs = res / dres

rs

                          10        30        100       300        1000
Select Label                                                           
loc    brod           0.747373  0.861979  0.891144  1.284235   3.872157
       columndrop     1.193983  1.292843  1.396841  1.484429   1.335733
       comp           0.802036  0.732326  1.149397  3.473283  25.565922
       comprehension  1.463503  1.568395  1.866441  4.421639  26.552276
       difference     1.413010  1.460863  1.587594  1.568571   1.569735
       in1d           0.818502  0.844374  0.994093  1.042360   1.076255
       isin           1.008874  0.879706  1.021712  1.001119   0.964327
       setdiff1d      1.352828  1.274061  1.483380  1.459986   1.466575
       setdifflst     1.233332  1.444521  1.714199  1.797241   1.876425
ridx   columndrop     0.903013  0.832814  0.949234  0.976366   0.982888
       comprehension  0.777445  0.827151  1.108028  3.473164  25.528879
       difference     1.086859  1.081396  1.293132  1.173044   1.237613
       setdiff1d      0.946009  0.873169  0.900185  0.908194   1.036124
       setdifflst     0.732964  0.823218  0.819748  0.990315   1.050910
ridxa  columndrop     0.835254  0.774701  0.907105  0.908006   0.932754
       comprehension  0.697749  0.762556  1.215225  3.510226  25.041832
       difference     1.055099  1.010208  1.122005  1.119575   1.383065
       setdiff1d      0.760716  0.725386  0.849949  0.879425   0.946460
       setdifflst     0.710008  0.668108  0.778060  0.871766   0.939537
slc    columndrop     1.268191  1.521264  2.646687  1.919423   1.981091
       comprehension  0.856893  0.870365  1.290730  3.564219  26.208937
       difference     1.470095  1.747211  2.886581  2.254690   2.050536
       setdiff1d      1.098427  1.133476  1.466029  2.045965   3.123452
       setdifflst     0.833700  0.846652  1.013061  1.110352   1.287831

fig, axes = plt.subplots(2, 2, figsize=(8, 6), sharey=True)
for i, (n, g) in enumerate([(n, g.xs(n)) for n, g in rs.groupby('Select')]):
    ax = axes[i // 2, i % 2]
    g.plot.bar(ax=ax, title=n)
    ax.legend_.remove()
fig.tight_layout()

Ini relatif terhadap waktu yang diperlukan untuk menjalankan df.drop(dlst, 1, errors='ignore'). Sepertinya setelah semua upaya itu, kami hanya meningkatkan kinerja secara sederhana.

 

Cara menggunakan PANDAS.DROP pada Python

Jika faktanya solusi terbaik menggunakan reindex atau reindex_axis pada retasan list(set(df.columns.values.tolist()).difference(dlst)). Tutup kedua dan masih sedikit lebih baik dari drop adalah np.setdiff1d.

rs.idxmin().pipe(
    lambda x: pd.DataFrame(
        dict(idx=x.values, val=rs.lookup(x.values, x.index)),
        x.index
    )
)

                      idx       val
10     (ridx, setdifflst)  0.653431
30    (ridxa, setdifflst)  0.746143
100   (ridxa, setdifflst)  0.816207
300    (ridx, setdifflst)  0.780157
1000  (ridxa, setdifflst)  0.861622