re.sub fehlerhaft mit "Erwartetes string- oder byteartiges Objekt"

Ich habe mehrere Beiträge zu diesem Fehler zu lesen, aber ich kann immer noch nicht herausfinden, es. Wenn ich versuche, Schleife durch meine Funktion:

def fix_Plan(location):
    letters_only = re.sub("[^a-zA-Z]",  # Search for all non-letters
                          " ",          # Replace all non-letters with spaces
                          location)     # Column and row to search    

    words = letters_only.lower().split()     
    stops = set(stopwords.words("english"))      
    meaningful_words = [w for w in words if not w in stops]      
    return (" ".join(meaningful_words))    

col_Plan = fix_Plan(train["Plan"][0])    
num_responses = train["Plan"].size    
clean_Plan_responses = []

for i in range(0,num_responses):
    clean_Plan_responses.append(fix_Plan(train["Plan"][i]))

Hier ist der Fehler:

Traceback (most recent call last):
  File "C:/Users/xxxxx/PycharmProjects/tronc/tronc2.py", line 48, in <module>
    clean_Plan_responses.append(fix_Plan(train["Plan"][i]))
  File "C:/Users/xxxxx/PycharmProjects/tronc/tronc2.py", line 22, in fix_Plan
    location)  # Column and row to search
  File "C:\Users\xxxxx\AppData\Local\Programs\Python\Python36\lib\re.py", line 191, in sub
    return _compile(pattern, flags).sub(repl, string, count)
TypeError: expected string or bytes-like object
Lösung

Wie Sie in den Kommentaren angegeben haben, scheinen einige der Werte Floats und keine Strings zu sein. Sie müssen sie in Strings ändern, bevor Sie sie an re.sub übergeben. Am einfachsten ist es, location in str(location) zu ändern, wenn Sie re.sub verwenden. Es kann nicht schaden, dies zu tun, auch wenn es bereits ein "str" ist.

letters_only = re.sub("[^a-zA-Z]",  # Search for all non-letters
                          " ",          # Replace all non-letters with spaces
                          str(location))
Kommentare (1)

Ich nehme an, besser wäre es, die Funktion re.match() zu verwenden. Hier ist ein Beispiel, das Ihnen helfen könnte.

import re
import nltk
from nltk.tokenize import word_tokenize
nltk.download('punkt')
sentences = word_tokenize("I love to learn NLP \n 'a :(")
#for i in range(len(sentences)):
sentences = [word.lower() for word in sentences if re.match('^[a-zA-Z]+', word)]  
sentences
Kommentare (0)

Die einfachste Lösung ist die Anwendung der Python-Str-Funktion auf die Spalte, durch die Sie eine Schleife ziehen wollen.

Wenn Sie Pandas verwenden verwenden, kann dies implementiert werden als

Datenrahmen['Spaltenname']=Datenrahmen['Spaltenname'].apply(str)

Kommentare (0)