2017-07-26 1 views
0

Ich habe diese Funktion:Pandas Dataframe.apply() wirft Typeerror für die Bereitstellung zu viele Argumente

def function(row,args): 
array = np.array(row['Revenue'+args[0]:'Revenue'+str(args[1])]).astype(float) 
if np.mean(array) < (5000/12): 
    return 'XXS' 
if np.mean(array) < (10000/12): 
    return 'XS' 
if np.mean(array) < (25000/12): 
    return 'S' 
if np.mean(array) < (50000/12): 
    return 'M' 
if np.mean(array) < (250000/12): 
    return 'L' 
if np.mean(array) < (750000/12): 
    return 'XL' 
if np.mean(array) >= (750000/12): 
    return 'XXL' 

Ich möchte diese Funktion anwenden Pandas.Dataframe.apply() verwenden. Also benutze ich Argumente, da ich zwei zusätzliche Argumente übergeben muss.

df.apply(function,axis=1,args=(VARIABLE1,VARIABLE2)) 

Irgendwie habe ich den Fehler:

TypeError: ('klantschaling() takes 2 positional arguments but 3 were given') 

ich natürlich zwei Argumente gebe: die Datenrahmen Reihe und args. Warum bekomme ich den Fehler?

Antwort

0

Sie haben zwei Möglichkeiten. Entweder Sie können Ihre Funktionssignatur ändern, oder Sie können ein Tupel in df.apply übergeben.

Die erste Option wäre, um Ihre Funktion wie folgt neu zu definieren:

def function(row, arg1, arg2): 
    ... 

Und dann df.apply nennen, wie Sie sind. Die zweite, einfachere Alternative ist Ihre Argumente in einer iterable einzuwickeln:

df.apply(function, axis=1, args=([VARIABLE1, VARIABLE2],)) 

Oder

df.apply(function, axis=1, args=((VARIABLE1, VARIABLE2),)) 
+0

einfach die Klammern das Hinzufügen funktioniert noch nicht. Etwas anderes muss getan werden, wenn ich das tue? – Duudsrednaz

+0

@Duudsrednaz Probieren Sie 'args = ((VARIABLE1, VARIABLE2),)'? –

+0

Funktioniert. Irgendein Grund, warum das bloße Tupel nicht funktionieren würde? – Duudsrednaz

Verwandte Themen