Vergleichen Sie Zeichenfolgen. Wenn der Datenrahmen-Datensatz einmal übereinstimmt, fahren Sie mit der nächsten Zeile fort

Dec 04 2020

Ich habe einen Datenrahmen wie folgt:

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

Ich habe eine Liste wie folgt:

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

Ich möchte Zeichenfolgen in den brand_listZeichenfolgen in der item_descripSpalte zuordnen und die Übereinstimmungen in der item_descripSpalte entfernen . Ich möchte eine weitere Spalte erstellen unbranded, die die bereinigten Zeichenfolgen enthält item_descrip.

Mein Problem ist, dass ich eine sehr große habe brand_listund einige der Zeichenfolgen aus dieser Liste mehrmals in der item_descripSpalte übereinstimmen . Meine gewünschte Ausgabe lautet: Wenn für eine Zeile bereits eine Übereinstimmung gefunden wurde, überspringen Sie diese Zeile.

Gewünschte Ausgabe:

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

Dies ist der Code, mit dem Übereinstimmungen entfernt werden, aber alle Übereinstimmungen in der item_descripSpalte werden entfernt. Zum Beispiel in meinem brand_listIch habe ebcund beerin der Liste. Für die erste Aufzeichnung möchte ich nur ebcentfernt werden und nicht, beerda bereits ein Match gemacht wurde. Wenn im ersten Teil der Zeichenfolge eine Übereinstimmung erzielt wird, verarbeiten Sie diesen Datensatz nicht weiter und fahren Sie mit dem nächsten fort.

Im Grunde scheint es so, als ob eine if-Anweisung in das Listenverständnis eingehen könnte, aber ich bin mir nicht sicher, wie ich etwas schreiben soll, das besagt: Wenn es übereinstimmt, suchen Sie weiter.

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

Ich habe das Beste aus diesem Einzeiler hier: https://stackoverflow.com/questions/51666374/how-to-remove-strings-present-in-a-list-from-a-column-in-pandas

Antworten

1 DaniMesejo Dec 04 2020 at 23:10

HAFTUNGSAUSSCHLUSS: Ich bin der Autor von trrex

Wenn Sie Wert auf Leistung legen, verwenden Sie 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)

Ausgabe

                 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

Die Funktion make erstellt einen regulären Ausdruck . Um besser zu verstehen, was passiert, generiert make den folgenden regulären Ausdruck:

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

Das Argument n = 1 bedeutet, dass das Muster nur einmal aus der Dokumentation ersetzt wird :

n int, Standard -1 (alle)

Number of replacements to make from start.