2016-06-20 2 views
1

Ich versuche, Schlüsselwörter in einer DataFrame-Spalte zu identifizieren und anschließend neue binäre Spalten zu erstellen, wenn die Schlüsselwörter identifiziert werden. Das folgende reproduzierbare Beispiel funktioniert, wenn die einzelnen String-Listen nur ein einziges zu identifizierendes Keyword enthalten. es zeigt auch auf Stufe 2, wo das Problem liegt.So identifizieren Sie mehr als ein Listenelement in einer for-Schleife

Das Problem ist, ich möchte mehr associated Schlüsselwörter zu jeder Liste hinzufügen, so dass zugeordnete Begriffe effektiv in die neuen Spalten kategorisiert werden können. Wenn ich jedoch mehr als ein Schlüsselwort zu den Listen hinzufüge, bekomme ich ValueError: Length of values does not match length of index.

# 1. Create dataframe 
test = {'comment': ['my pay review was not enough', 
        'my annual bonus was too low, I need more pay', 
        'my pay is too low', 'my bonus is huge', 'better pay please'], 
     'team': ['team1', 'team2', 'team3', 'team1', 'team2']} 

test = pd.DataFrame(test) 

# 2. create string lists - (these are the lists I want to add multiple associated keywords too) 
pay_strings = ['pay'] 
bonus_strings = ['bonus'] 

# 3. Create empty lists 
pay_col = [] 
bonus_col = [] 

# 4. Loop through `comment` column to identify words and represent them in the new lists with binary values 

for row in test['comment']: 
    for pay in pay_strings: 
     if pay in row: 
      pay_col.append(1) 
     elif pay not in row: 
      pay_col.append(0) 

    for bonus in bonus_strings: 
     if bonus in row: 
      bonus_col.append(1) 
     elif bonus not in row: 
      bonus_col.append(0)   

# 5. Add new lists to dataframe 

test['pay'] = pay_col 
test['bonus'] = bonus_col 
test 

# 6. Resulting dataframe 
    comment          team pay bonus 
0 my pay review was not enough     team1 1  0 
1 my annual bonus was too low, I need more pay team2 1  1 
2 my pay is too low        team3 1  0 
3 my bonus is huge        team1 0  1 
4 better pay please        team2 1  0 

Gibt es eine Möglichkeit, mehrere Elemente in Listen effektiv nachzuschlagen, oder gibt es eine bessere Möglichkeit, dies zu tun?

Antwort

1

Wie beschrieben, wenn Sie zusätzliche Schlüsselwörter hinzufügen, überschreitet die Länge der resultierenden Pay_col-Liste die Anzahl der Zeilen in Ihrem Datenframe, die den referenzierten Fehler verursacht.

Ändern Sie diesen Codeblock:

for row in test['comment']: 
    for pay in pay_strings: 
     if pay in row: 
      pay_col.append(1) 
     elif pay not in row: 
      pay_col.append(0) 

entweder eine eindeutige Zählung für jedes Keyword halten (in dem Fall, dass Sie eine Spalte für jedes der Keywords in Ihrem pay_string Keyword-Liste haben) oder ändern die zu erhöhen, Zähle für jede Zeile (dh, Kommentar), wenn eine Übereinstimmung bereits identifiziert wurde.

+0

Ich folge Ihrem Denken, aber Ihre Vorschläge sind ein wenig jenseits der Python-Ebene. Könnten Sie mir einen Hinweis geben, wie Sie Letzteres tun können? – RDJ

+0

pay_col = [0 für _ in pay_string] # initialisieren Sie dann Ihren "Treffer" -Zähler, anstatt 1 anzuhängen, wenn eine Übereinstimmung gefunden wird, versuchen Sie den vorhandenen (0) Zählwert wie in: pay_col [

+0

Danke. Ich kann entweder nicht dem folgen, was du vorschlägst, oder du kannst deinen Vorschlag nicht zur Ausführung bringen. Ich muss zurück zum Zeichenbrett gehen. Ich hatte keine Idee, Worte aus einer Kolumne auf diese Weise zu extrahieren, wäre so kompliziert. – RDJ

Verwandte Themen