2017-04-24 12 views
1

ich Pandas Datenrahmen haben, die Anwendung Funktion erscheint als:über Datenrahmen Spalten für jede Zeile

df1['A'].ix[1:3]  Sims   Grade SleepNumber 
2017-01-01 02:00:00 [33, 34, 39] 5  6 
2017-01-01 03:00:00 [3, 43, 9] 1  12 

Ich habe eine Funktion wie folgt definiert:

def Fn(S, G, SL): 
#some complicated operation but for example it returns only product 
return S*G*SL 

ich folgendes für jede Zeile tun wollen von df1 einen Datenrahmen zu erhalten, wie:

df1['A'].ix[1:3]  FnResult 
2017-01-01 02:00:00 [Fn(33, 5, 6), Fn(34, 5, 6), Fn(39, 5, 6)] 
2017-01-01 03:00:00 [Fn(3, 1, 12), Fn(43, 1, 12), Fn(9, 1, 12)] 

ich habe versucht, die folgenden:

z1 = df1.apply(map(lambda x:Fn([x, x.Grade, x.SleepNumber]), x.Sims)) 

Aber ich richte es nicht richtig aus, damit es ausgeht.

Antwort

0

Sie könnten umschreiben Ihre Fn wie, da S ist eine Spalte von Listen:

def Fn(S, G, SL): 
    return [s*G*SL for s in S] 

df['FnResult'] = df.apply(lambda r: Fn(r.Sims, r.Grade, r.SleepNumber), axis=1).values.tolist() 

df 
#       Sims Grade SleepNumber   FnResult 
#2017-01-01 02:00:00 [33, 34, 39] 5   6 [990, 1020, 1170] 
#2017-01-01 03:00:00  [3, 43, 9] 1   12  [36, 516, 108] 

oder ohne Änderung Fn, ändern Sie die map Funktion im apply Verfahren; Daran erinnern, dass map selbst nicht aufrufbar ist, müssen Sie es wickeln in einem anderen Lambda:

df['FnResult'] = df.apply(lambda r: list(map(lambda s: Fn(s, r.Grade, r.SleepNumber), r.Sims)), axis=1) 

df 
#        Sims Grade SleepNumber   FnResult 
#2017-01-01 02:00:00 [33, 34, 39]  5   6 [990, 1020, 1170] 
#2017-01-01 03:00:00 [3, 43, 9]   1   12  [36, 516, 108] 
+0

Leider Fn grandfathered ist und ich kann nicht neu schreiben sie. – Zanam

Verwandte Themen