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 complete
sollteA20-6014
extrahiert werden) - Sätze, die mit Wörtern mit Zahlen beginnen, sollten extrahiert werden (für Satz
A20-6014 short complete
sollteA20-6014
extrahiert werden) - Sätze, die mit Wörtern mit Zahlen enden, sollten extrahiert werden (für Satz
short complete A20-6014
sollteA20-6014
extrahiert 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 SIL
sollte2.5 IN 90
extrahiert 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 SatzELBOW- 2.5 IND 90 SIL
,2.5_90
sollte extrahiert werden. ) - Ein weiterer Testfall: für einen Satz
90 CONN 3/4 ST-#8 FL
sollte90_3/4_ST-#8
extrahiert 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)