2017-01-03 4 views
1

Die folgende Funktion verwendet:Python Pandas: Funktion funktioniert nicht, wenn mit apply()

def func(x): 
    for k in x['slices']: 
     for j in k: 
      print(x['low'].iloc[j]) 

in folgenden Weise angewandt funktioniert:

func(test) 

aber wie folgt nicht:

test.apply(func, axis=1) 

Können Sie feststellen, warum?


EDIT: Ich habe den Druck nur für Debug-Zwecke: die Funktion verwendet werden:

def func(x): 
    result=[] 
    for k in x: 
     for j in k:  
      result.append(x['low'].iloc[j]) 
    return result 

die auch nicht

Unter den Elementen, die Daten rekonstruiert funktionierten.

df = pd.DataFrame(dict, columns=["low", "slices"]) 

    dict = {'low': {0: 1207.25, 
     1: 1207.5, 
     2: 1205.75, 
     3: 1206.0, 
     4: 1201.0, 
     5: 1202.75, 
     6: 1203.75}, 
    'slices': {0: [slice(1, 2, None)], 
     1: [slice(1, 3, None), slice(2, 3, None)], 
     2: [slice(1, 4, None), slice(2, 4, None), slice(3, 4, None)], 
     3: [slice(1, 5, None), 
     slice(2, 5, None), 
     slice(3, 5, None), 
     slice(4, 5, None)], 
     4: [slice(1, 6, None), 
     slice(2, 6, None), 
     slice(3, 6, None), 
     slice(4, 6, None), 
     slice(5, 6, None)], 
     5: [slice(1, 7, None), 
     slice(2, 7, None), 
     slice(3, 7, None), 
     slice(4, 7, None), 
     slice(5, 7, None), 
     slice(6, 7, None)], 
     6: [slice(1, 8, None), 
     slice(2, 8, None), 
     slice(3, 8, None), 
     slice(4, 8, None), 
     slice(5, 8, None), 
     slice(6, 8, None), 
     slice(7, 8, None)]}} 
+0

Was ist das beobachtete Verhalten, wenn Sie sich bewerben verwenden? Gibt es einen Fehler? Druckt es leere Zeichenfolgen? Weitere Informationen helfen, die Frage zu beantworten. – Apollo2020

+0

@dave Bei der Verwendung von apply() ist der zurückgegebene Fehler: 'eine Ganzzahl ist erforderlich' und' KeyError: ('Slices', 'bei Index-Slices aufgetreten') '. Beachten Sie, dass bei Verwendung von 'func (test)' 'die korrekte Ausgabe ohne Fehlermeldung zurückgegeben wird. –

+0

@jimbasquiat Wie soll das Ergebnis aussehen, eine neue 'Serie' mit Listen aus den Slices? –

Antwort

2

definieren Sie Ihre Funktion auf diese Weise

def fun(slices): 
    return [df.low.loc[s].tolist() for s in slices] 

und gelten über die Scheiben Spalte

df['slices_low'] = df.slices.apply(fun) 

df 

enter image description here

+0

nein ich kann nicht so drastisch die Funktion ändern. Ich möchte verstehen, warum 'func (test)' und 'test.apply (func)' anders sind. Ich verstehe nicht, warum Sie sagen, dass * test.apply (func, axis = 0) dem Aufruf von func (test ['low']) entspricht und dann func (test ['slices']) separat aufruft. * Für mich wäre das wahr von 'map', aber nicht von' apply'. 'apply' betrachtet jede Zeile als eine Serie, nein? –

+0

nein! 'apply' behandelt jede Spalte als eine Reihe, es sei denn, Sie übergeben 'axis = 1'. Der 'axis' Parameter sagt' apply' an, welche Achse als Index der Serie verwendet werden soll. Wenn "axis = 0" ist, werden die Zeilenindizes als Index verwendet und das bedeutet, dass Spalten die Objekte sind, die an die "apply" -Funktion übergeben werden. – piRSquared

+0

Ja, ich denke, "Achse = 1" ist das erste, was ich tatsächlich versucht habe. Aber es sollte funktionieren, oder? Es gibt 'TypeError zurück: ('' slice 'Objekt ist nicht iterierbar', 'trat bei Index 0 auf') Sorry, ich bin verwirrt, ich habe so viele Dinge versucht ... –

Verwandte Themen