[FIXED] Numerische Informationen aus der Pandas-Spalte mit Regex extrahieren

Ausgabe

Ich versuche, die hervorgehobenen “numerischen Informationen” aus einer Pandas DataFrame-Spalte zu extrahieren:

Text
Maße:23"/60
Maße:23" / 60
Maße:48"
Maße:22.5X8.25
Maße:80IN
Maße:567 S
Maße:22.5X8.25
Maße:26INNP
Maße: 24" x 55"mit Rohr16 x 7

Ich verwende Regex und ist wie folgt:regex = r"(\d([^\s]*)\s.\s\d*[^\s])|(\d([^\s])*)"

Ich verwende das folgende Skript, um eine neue Spalte mit allen numerischen Informationen zu erstellen, die aus jedem Satz extrahiert und mit ‘_’ kombiniert werden.

df2['Numeric_Info'] = df2['Text'].apply(lambda x: '_'.join([i[0] for i in re.findall(regex, str(x))]))

Kann mir jemand sagen was ich falsch mache?

Bearbeiten:

Festlegen von Regeln für das Muster, um die Regex zu festigen:

  • Sätze, die Wörter mit Zahlen enthalten, sollten extrahiert werden (für Satz short A20-6014 completesollte A20-6014extrahiert werden)
  • Sätze, die mit Wörtern mit Zahlen beginnen, sollten extrahiert werden (für Satz A20-6014 short completesollte A20-6014extrahiert werden)
  • Sätze, die mit Wörtern mit Zahlen enden, sollten extrahiert werden (für Satz short complete A20-6014sollte A20-6014extrahiert werden)
  • Wörter mit zwei Buchstaben zwischen Wörtern, die Zahlen enthalten, sollten berücksichtigt werden (dh für Satz ELBOW- 2.5 IN 90 SILsollte 2.5 IN 90extrahiert werden)
  • Wörter mit mehr als 2 Buchstaben zwischen Wörtern, die Zahlen enthalten, sollten separat extrahiert und mit einem verbunden werden _. Dies gilt auch für alphanumerische Wörter, die an zwei verschiedenen Stellen in einem Satz vorkommen (z. B. für Satz ELBOW- 2.5 IND 90 SIL, 2.5_90sollte extrahiert werden. )
  • Ein weiterer Testfall: für einen Satz 90 CONN 3/4 ST-#8 FLsollte 90_3/4_ST-#8extrahiert werden

Lösung

Sie können verwenden

regex = r'\d+(?:\.\d+)?"?(?:\s*[Xx/.]\s*\d+(?:\.\d+)?"?)?(?:\s*[A-Z]+\b)?'
df2['Numeric_Info'] = df2['Text'].str.findall(regex).str.join('_')

Sehen Sie sich die Regex-Demo an .

Einzelheiten :

  • \d+(?:\.\d+)?– ein Int- oder Float-Wert
  • "?– ein optionales "Zeichen
  • (?:\s*[Xx/.]\s*\d+(?:\.\d+)?"?)?– eine optionale Folge von

    • \s*[Xx/.]\s*X, x, /oder .in null oder mehr Leerzeichen eingeschlossen
    • \d+(?:\.\d+)?– ein Int- oder Float-Wert
    • "?– ein optionales "Zeichen
  • (?:\s*[A-Z]+\b)?– eine optionale Folge von

    • \s*– null oder mehr Leerzeichen
    • [A-Z]+– ein oder mehrere ASCII-Großbuchstaben
    • \b– eine Wortgrenze.

Hier ist ein Pandas-Test:

import pandas as pd
df = pd.DataFrame({'Text':['No data here','Dimensions: 23"/60', 'Dimensions: 23" / 60', 'Dimensions: 48"', 'Dimensions: 22.5X8.25', 'Dimensions: 80IN', 'Dimensions: 567 S','Dimensions: 22.5X8.25', 'Dimensions: 26INNP','Dimensions: 24" x 55" with pipe 16 x 7']})
regex = r'\d+(?:\.\d+)?"?(?:\s*[Xx/.]\s*\d+(?:\.\d+)?"?)?(?:\s*[A-Z]+\b)?'
df['Numeric_Info'] = df['Text'].str.findall(regex).str.join('_')

Ausgabe:

>>> df
                                     Text      Numeric_Info
0                            No data here                  
1                      Dimensions: 23"/60            23"/60
2                    Dimensions: 23" / 60          23" / 60
3                         Dimensions: 48"               48"
4                   Dimensions: 22.5X8.25         22.5X8.25
5                        Dimensions: 80IN              80IN
6                       Dimensions: 567 S             567 S
7                   Dimensions: 22.5X8.25         22.5X8.25
8                      Dimensions: 26INNP            26INNP
9  Dimensions: 24" x 55" with pipe 16 x 7  24" x 55"_16 x 7


Beantwortet von –
Wiktor Stribiżew


Antwort geprüft von –
Timothy Miller (FixError Admin)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like