2016-09-25 3 views
1

Ich habe Datenrahmen in Pandas und ich habe eine Funktion geschrieben, um die Informationen in jeder Zeile zu verwenden, um eine neue Spalte zu generieren. Ich möchte das Ergebnis in einem Listenformat sein:Eine Liste als Ergebnis einer Funktion in Pandas

 A B C 
     3 4 1 
     4 2 5 

    def Computation(row): 
      if row['B'] >= 3: 
       return [s for s in range(row['C'],50)] 
      else: 
       return [s for s in range(row['C']+2,50)] 

    df['D'] = df.apply(Computation, axis = 1) 

Allerdings erhalte ich folgende Fehlermeldung:

„konnte nicht Eingabearray übertragen von Form (308) in Form (9)“

Können Sie mir bitte sagen, wie Sie dieses Problem lösen können?

Antwort

1

Sagen Sie bitte mit

In [25]: df = pd.DataFrame({'A': [3, 4], 'B': [4, 2], 'C': [1, 5]}) 

Dann starten Sie es mindestens zwei Möglichkeiten, es zu tun.

können Sie gelten zweimal auf der C Spalte, aber schalten Sie die B Säule:

In [26]: np.where(df.B >= 3, df.C.apply(lambda c: [s for s in range(c, 50)]), df.C.apply(lambda c: [s for s in range(c + 2, 50)])) 
Out[26]: 
array([ [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49], 
     [7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49]], dtype=object) 

Oder Sie können auf der B Wert pro Zeile auf der gesamten Reihe und Schalter gelten:

In [27]: df.apply(lambda r: [s for s in range(r.C, 50)] if r.B >= 3 else [s for s in range(r.C + 2, 50)], axis=1) 
Out[27]: 
0 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14... 
1 [7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, ... 

Beachten Sie, dass die Rückgabetypen unterschiedlich sind, aber Sie können immer noch

df['foo'] = <each one of the above options> 
schreiben
+0

Das ist großartig. Aber wie kann ich das implementieren, wenn der Anfangspunkt des Bereichs vom Wert von B in jeder Zeile abhängt? – user36729

+0

@ user36729 Können Sie ein konkretes Beispiel dafür geben, was Sie tun möchten? Wäre ein Bereich zwischen b und 4c ein gutes Beispiel? –

+0

Das habe ich in meiner Hauptfrage gemacht. – user36729

Verwandte Themen