bandingkan string, jika record dataframe cocok sekali kemudian lanjutkan ke baris berikutnya

Dec 04 2020

Saya memiliki kerangka data seperti ini:

df = pd.DataFrame({'item_descrip': ['ebc root beer single', 
                                    'yic yac big pack freshmint', 
                                    'froggy jumbo flakes',
                                    'jumbo tart warmer',
                                    'beer jerky'
                                   ]
})

Saya punya daftar seperti ini:

brand_list = ['ebc', 'yic yac', 'beer', 'jumbo', 'tart', 'froggy']

Saya ingin mencocokkan string di brand_listke string di item_descripkolom dan menghapus kecocokan di item_descripkolom. Saya ingin membuat kolom lain unbrandedyang berisi string yang dibersihkan dari item_descrip.

Masalah saya adalah saya memiliki yang sangat besar brand_listdan beberapa string dari daftar ini cocok beberapa kali di item_descripkolom. Output yang saya inginkan adalah jika kecocokan sudah ditemukan untuk satu baris, maka lewati baris itu.

Output yang diinginkan:

|    | item_descrip                       | unbranded                          |
|---:|:-----------------------------------|:-----------------------------------|
|  0 | ebc root beer single               | root beer single                   |
|  1 | yic yac big pack freshmint singles | big pack freshmint singles         |
|  2 | froggy jumbo flakes                | jumbo flakes                       |
|  3 | jumbo tart warmer                  | tart warmer                        |
|  4 | beer jerky                         | jerky                              |

Ini adalah kode yang berfungsi untuk menghapus kecocokan, tetapi menghapus semua kecocokan di item_descripkolom. Misalnya, di saya brand_listsaya punya ebcdan beerdi daftar. Untuk rekaman pertama, saya hanya ingin ebcdihapus dan bukan beerkarena pertandingan sudah dibuat. Jika ada kecocokan pada bagian pertama string, maka jangan proses rekaman itu lebih jauh dan lanjutkan ke bagian berikutnya.

Jadi pada dasarnya, sepertinya pernyataan if bisa masuk ke pemahaman daftar, tetapi saya tidak yakin bagaimana menulis sesuatu yang mengatakan: jika cocok lulus, yang lain terus mencari.

df['unbranded'] = [' '.join([y for y in x.split() if not y.startswith(tuple(brand_list))]) for x in df['item_descrip']] 

Saya mendapatkan hasil maksimal dari satu baris ini di sini: https://stackoverflow.com/questions/51666374/how-to-remove-strings-present-in-a-list-from-a-column-in-pandas

Jawaban

1 DaniMesejo Dec 04 2020 at 23:10

DISCLAIMER: Saya adalah penulis trrex

Jika Anda peduli dengan kinerja, gunakan trrex :

import pandas as pd
import trrex as tx

df = pd.DataFrame({'item_descrip': ['ebc root beer single',
                                    'yic yac big pack freshmint',
                                    'froggy jumbo flakes',
                                    'jumbo tart warmer',
                                    'beer jerky'
                                    ]
                   })

brand_list = ['ebc', 'yic yac', 'beer', 'jumbo', 'tart', 'froggy']

df['unbranded'] = df['item_descrip'].str.replace(tx.make(brand_list), '', n=1)
print(df)

Keluaran

                 item_descrip            unbranded
0        ebc root beer single     root beer single
1  yic yac big pack freshmint   big pack freshmint
2         froggy jumbo flakes         jumbo flakes
3           jumbo tart warmer          tart warmer
4                  beer jerky                jerky

Fungsi make akan membangun sebuah trie regex . Untuk lebih memahami apa yang terjadi, make menghasilkan ekspresi reguler berikut:

\b(?:froggy|tart|beer|yic yac|jumbo|ebc)\b

Argumen n = 1, berarti pola hanya akan diganti satu kali, dari dokumentasi :

n int, default -1 (semua)

Number of replacements to make from start.