2017-05-11 4 views
0

Ich habe einen Pandas, der 6x3 ist und die Spalten stellen mal dar.Funktion auf Datensatz anwenden, um dynamisch zu ersetzen

Ich möchte Werte auf Bedingungen ersetzen:

def substituteMin(x,n,c,k): 
    if x < (1 - c)^n+sqrt(k): 
     x = (1 - c)^n+sqrt(k) 
    else: 
     pass 
    return x 
df1 = df.apply(lambda x: compareMin(x, x.name)) 
print (df1) 

wobei c und k konstant sind. Und n ist der Spaltenname. Es gibt mir den Fehler

"ValueError: ('The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().', u'occurred at index 1.0')"

Ich versuchte Funktion zu betrachten ersetzen, aber sie funktionierte nicht.

+2

> „Ich habe einen ** Panda **, die 6x3 ist und die Spalten repräsentieren Zeiten“ - Was füttern Sie es? – ThrowingSpoon

+0

was sind 'n, c, k'? Sind sie Konstanten? – MaxU

+0

Der Fehler besteht darin, dass Sie einen Vergleich für eine Serie durchführen und einen einzelnen Wert zurückgeben. Pandas/Python weiß nicht, welchen einzelnen Wert zurückgegeben werden soll, wenn ein Teil der Serie True ist und ein Teil der Serie False ist. Daher die "mehrdeutige" Ausnahme. Sie können die Funktion wie all() oder any() verwenden, um die Reihe True/False auf einen Wert zu reduzieren. –

Antwort

0

Hier habe ich Ihren Code vereinfacht.

def func(x,n=0,c=1,k=2): 
    if x < (1 - c)^n+sqrt(k): 
     x = (1 - c)^n+sqrt(k) 
    return x 
df1 = df.applymap(lambda x: func(x)) 
print (df1) 

Modifikationen:

  1. applymap ersetzen elementweise.
  2. Funktionsnamen waren inkonsistent: substituteMin, compareMin.
  3. In der Funktion (substituteMin) können konstante Variablen (n, c, k) nur in der Funktion gesetzt werden.

(Es gibt viel in Frage zu kommentieren und zu bearbeiten. Derzeit habe ich keine Privilegien.)

+0

Danke, aber wie kann ich n an den Spaltennamen übergeben? Ich würde "Lambda x: func (x, x.name)" tun, aber es funktioniert nicht – Thegamer23

+0

das ist, weil 'x' würde kein Attribut' name' haben. Um Ihr Ziel zu erreichen, sollten Sie einfach über Zeilen und Spalten iterieren (verschachtelt). z.B. 'für Spalte in df: für Reihe im df.index: y = func (df.loc [Reihe, Spalte], Spalte)' Anmerkung: gehe zu neuer Zeile nach ':' s. Es ist kein Liner wie 'Lambda'. – rraadd88

Verwandte Themen