2016-04-20 11 views
0

Ich wollte eine Funktion über jede Zeile des Pandas-Datenrahmens ausführen und geben Sie ihren Wert in der abgeleiteten Spalte Punktzahl: Die Funktion unten ist ein Lambda zum Beispiel aber die Funktion sollte in der Lage sein zu indizieren von der Mutterdatenrahmen Spaltenbeschriftungen und Zugang Spaltennamen wie row [ ‚col1‘], aber eine Serie Objekt wird an die Lambda-Funktion übergeben, die die Spaltenbeschriftung Informationen verlieren:Indizierung Pandas-Serie mit übergeordneten Dataframe-Index

zB:

def calculate(row): 
    cols=row.columns 
    loc=row['loc'] 
    h=row['h'] 
    isst=row['Ist'] 
    Hol=row['Hol'] 
    return loc+h+len(cols) 

a['score']=a.apply(lambda row:calculate(row),axis=1) 

gibt:

AttributeError: ("'Series' object has no attribute 'columns'", u'occurred at index 0') 

also wie kann ich auf eine benannte Serie wie ein benanntes Tupel in der Lambda-Funktion zugreifen?

Eine schnelle Hack zu tun wäre:

a['score']=a.apply(lambda row:calculate(makedict(row,row.index)),axis=1) 

wo makedict Funktion ein Wörterbuch für jede Zeile schaffen wird, so dass er in der Funktion von Spaltenbeschriftungen zugegriffen werden. Aber gibt es einen Pandas Weg?

Antwort

0

fand schließlich die to_dict Funktion, die das hilft:

def calculate(row): 
    row=row.to_dict() 
    loc=row['loc'] 
    h=row['h'] 
    isst=row['Ist'] 
    Hol=row['Hol'] 
    return loc+h+len(row.keys()) 

a['score']=a.apply(calculate,axis=1) 
0

Warum nicht: Indizierung daher Spalte

a['score']=a.apply(lambda row:row['loc'] + row['h']+len(row.index),axis=1) 
+0

Reihe wird eine Serie Objekt nicht möglich – stackit

+1

A 'DataFrame' einen Index und Spalten. Nach dem Extrahieren einer Reihe aus dem Rahmen ist es eine "Reihe", die wie oben einen Index aufweist. Der Index für die neue Serie ist identisch mit den Spalten im DataFrame. –