2016-03-19 5 views
1

Ich mag die Anzahl, wie oft ein Wort in der ZeichenfolgeWie wird die Split-Funktion in jeder Zeile in einem Datenrahmen in Python verwendet?

Überprüfung wiederholt wird

ich die CSV-Datei lese und es Datenrahmen in einem Python-Speicherung zählen, die unter der Linie mit

reviews = pd.read_csv("amazon_baby.csv") 

Der Code in Die folgenden Zeilen funktionieren, wenn ich sie auf eine einzelne Bewertung anwende.

print reviews["review"][1] 
a = reviews["review"][1].split("disappointed") 
print a 
b = len(a) 
print b 

Der Ausgang für die oben genannten Linien waren

it came early and was not disappointed. i love planet wise bags and now my wipe holder. it keps my osocozy wipes moist and does not leak. highly recommend it. 
['it came early and was not ', '. i love planet wise bags and now my wipe holder. it keps my osocozy wipes moist and does not leak. highly recommend it.'] 
2 

Wenn ich die gleiche Logik auf den gesamten Datenrahmen unter Verwendung der unter der Linie beantragen. Ich erhalte eine Fehlermeldung

reviews['disappointed'] = len(reviews["review"].split("disappointed"))-1 

Fehlermeldung:

Traceback (most recent call last): 
    File "C:/Users/gouta/PycharmProjects/MLCourse1/Classifier.py", line 12, in <module> 
    reviews['disappointed'] = len(reviews["review"].split("disappointed"))-1 
    File "C:\Users\gouta\Anaconda2\lib\site-packages\pandas\core\generic.py", line 2360, in __getattr__ 
    (type(self).__name__, name)) 
AttributeError: 'Series' object has no attribute 'split' 

Antwort

4

Sie versuchen, die gesamte Überprüfung Spalte des Datenrahmens zu teilen (was die Serie ist in der Fehlermeldung erwähnt). Was Sie tun möchten, ist eine Funktion, die jeder Zeile des Datenrahmens gelten, die Sie durch den Aufruf apply auf dem Datenrahmen kann:

f = lambda x: len(x["review"].split("disappointed")) -1 
reviews["disappointed"] = reviews.apply(f, axis=1) 
+0

Muss ich an diesem Code alle anderen Zeilen hinzufügen müssen andere als die Daten in die Bewertungen Variable zu lesen? Weil die obigen zwei Zeilen nicht funktionierten. – goutam

+0

Ich denke, es sollte wie geschrieben funktionieren, aber ich habe es nicht getestet. Was schief gelaufen ist? – hoyland

+0

File "Classifier.py", Zeile 18, in Bewertungen [ "enttäuscht"] = reviews.apply (f, Achse = 1) File "pandas \ core \ frame.py", Linie 3972, gelten in return self._apply_standard (f, axis, reduce = reduzieren) Datei "pandas \ core \ frame.py", Zeile 4064, in _apply_standard Ergebnisse [i] = func (v) Datei "Classifier.py", Zeile 17, in f = lambda x: len (bewertungen ["review"]. split ("enttäuscht")) -1 Datei "pandas \ core \ generic.py", Zeile 2360, in __getattr__ (type (self).__name__, name)) AttributeError: ('' Series 'Objekt hat kein Attribut' split '", bei' 0 ') – goutam

1

Nun ist das Problem,

reviews["review"] 

a Serie. In Ihrem ersten Schnipsel tust du das,

reviews["review"][1].split("disappointed") 

einen Index für die Bewertung Einlochen. Sie könnten versuchen, alle Zeilen der Spalte zu durchlaufen und die gewünschte Aktion auszuführen. Zum Beispiel

for index, row in reviews.iterrows(): 
    print len(row['review'].split("disappointed")) 
-1

können Sie .str verwenden, um String-Methoden auf Reihe von Zeichenfolgen zu verwenden:

reviews["review"].str.split("disappointed") 
+0

str löst das Problem nicht. reviews ["review"] gibt eine Reihe von Strings an, nicht einen String. –

+0

@OzgurOzturk Es löst das Problem der Anwendung von Split auf jede Zeile. Id löst das Problem der Berechnung der Längen nicht, weil ich dachte, das sei einfach genug. Und ich weiß, dass 'Reviews [" review "]' eine Reihe von Strings ist. Warum glaubst du, ich nicht? – Goyo

1

Pandas 0.20.3 hat pandas.Series.str.split(), die auf jeden wirkt String der Serie und macht den Split. So können Sie einfach geteilt und dann zählen die Anzahl der Teilungen gemacht

len(reviews['review'].str.split('disappointed')) - 1 

pandas.Series.str.split

Verwandte Themen