Bagaimana saya menjatuhkan jumlah baris yang terbatas? Sejauh ini, kode saya menjatuhkan setiap contoh yang saya berikan. Jadi pada contoh di bawah ini, setiap instance 'anjing' dijatuhkan. Namun, saya ingin menjatuhkan jumlah ...

2
Zizi96 5 April 2021, 19:38

2 jawaban

Jawaban Terbaik

Jika banyak hewan dan jumlah yang berbeda, Anda dapat groupby + sample. Simpan hewan dan jumlah dalam dict, lalu perbarui angka yang benar.

Ini akan jatuh secara acak dan jika Anda menentukan dan lebih besar dari jumlah baris, itu menjatuhkan semuanya untuk hewan itu

to_drop = {'dog': 2, 'raccoon': 1}

l = []
for animal, gp in df.groupby('Animal'):
    l.append(gp.sample(n=max(0, len(gp)-to_drop.get(animal, 0)), replace=False))

pd.concat(l).sort_index()

   Number   Color   Animal
1      20   white      cat
3      10   green    gecko
4      40   white     bear
5      50  orange  raccoon
7      60   black     goat
8      70    blue     goat
9      20     red      dog

Yang di atas tidak terlalu efisien, jadi memanfaatkan ide pintar @ quanhoang untuk cumbount kami pertama-tama mengocok seluruh dataFRAME (.sample(frac=1)) seperti itu kami secara acak menjatuhkan baris dan membandingkan cump-off dengan cump-off.

to_drop = {'dog': 2, 'raccoon': 1}

m = (df.sample(frac=1).groupby('Animal').cumcount()
       .lt(df['Animal'].map(to_drop)))
df = df[~m]
1
ALollz 5 April 2021, 17:24

Anda dapat mencoba:

to_drop = ['dog']
s = df['Animal'].isin(to_drop)

mask = s & s.cumsum().le(2)

df[~mask]

Keluaran:

   Number   Color   Animal
1      20   white      cat
2      30   black  raccoon
3      10   green    gecko
4      40   white     bear
5      50  orange  raccoon
7      60   black     goat
8      70    blue     goat
9      20     red      dog

Update : Dalam hal to_drop memiliki beberapa label dan Anda ingin menjatuhkan 2 instance dalam masing-masing to_drop , Anda dapat melakukan {{x2} }}:

mask = (df['Animal'].isin(to_drop) &
        df.groupby('Animal').cumcount().lt(2)
       )
print(df[~mask])
2
Quang Hoang 5 April 2021, 16:40