Antwort mit KI erzeugt
Fehlerursache verstehen
Das Hauptproblem in Ihrem Code liegt in der Art und Weise, wie Sie den Dataframe iterieren und auf Elemente zugreifen. Der Fehler
TypeError: normalize() argument 2 must be str, not Series
deutet darauf hin, dass die
normalize
Funktion einen String als zweites Argument erwartet, aber stattdessen eine pandas Series erhält.
Wenn Sie
df_news.T.iteritems()
verwenden, bekommen Sie das Transponierte des Dataframes, was bedeutet, dass Ihre Iterationsvariable
date
eigentlich die Spaltennamen (also 'Date' und 'name') und
row
die jeweiligen Werte in jeder Zeile sind.
Das Problem tritt auf, weil
df_news.loc[date, 'name']
versucht, auf eine Zeile mit dem Index
date
(welcher tatsächlich ein Spaltenname ist) und die Spalte
name
zuzugreifen. Da
date
nicht als Index in Ihrem DataFrame existiert, gibt
df_news.loc[date, 'name']
eine Series zurück statt eines einzelnen Wertes. Das führt dazu, dass
normalize
den Fehler wirft, da es erwartet, einen String zu erhalten, nicht eine Series.
Lösung
Um das Problem zu beheben, sollten Sie den Dataframe direkt iterieren, ohne ihn zu transponieren. Sie können
iterrows()
verwenden, um durch die Zeilen des Dataframes zu iterieren:
python
from nltk.sentiment.vader import SentimentIntensityAnalyzer
import pandas as pd
import unicodedata
# Annahme, dass df_news ein vordefinierter DataFrame mit Ihren Daten ist
sid = SentimentIntensityAnalyzer()
# Hinzufügen neuer Spalten für Sentiment Scores
df_news['compound'] = None
df_news['neg'] = None
df_news['neu'] = None
df_news['pos'] = None
for index, row in df_news.iterrows():
try:
sentence = unicodedata.normalize('NFKD', row['name']).encode('ascii','ignore')
# Umwandlung byte zu str
sentence = sentence.decode('utf-8')
ss = sid.polarity_scores(sentence)
df_news.at[index, 'compound'] = ss['compound']
df_news.at[index, 'neg'] = ss['neg']
df_news.at[index, 'neu'] = ss['neu']
df_news.at[index, 'pos'] = ss['pos']
except TypeError as e:
print(row['name'])
print(index)
print(str(e))
# Überprüfung der Ergebnisse
print(df_news.head())
Beachten Sie die Verwendung von
df_news.at[index, 'compound']
zum Setzen der Werte.
set_value
ist seit pandas 0.21.0 veraltet und sollte vermieden werden.
Zusätzlich wurde die Byte-Ausgabe von
encode
mit
decode('utf-8')
in einen String umgewandelt, weil
polarity_scores
einen String erwartet. Dies behebt das Formatproblem, sodass der Sentiment Analyzer korrekt mit den String-Werten arbeiten kann.