2017-03-28 5 views
0

Ich habe einen Pandas Datenrahmen und eine der Spalten ist eine Zeichenfolge. Ich habe eine Funktion von einem externen Modul importiert, um einige RegEx-Prüfungen durchzuführen und diese Zeichenfolge auf eine kurze Klassifizierung zu reduzieren.Pandas DataFrame Übernehmen Funktion, mehrere Argumente

Dies funktioniert:

df['PageCLass'] = df['PageClass'].apply(lambda x: PageClassify.page_classify(x)) 

Doch was würde ich wirklich tun möchte, ist eine weitere Spalte ‚Rev‘ in der Datenrahmen enthalten, die einen Schwimmer oder NaN in der Prüfung sein geschieht entweder.

Als ich dies tat:

df['PageCLass'] = df['PageClass'].apply(lambda x: PageClassify.page_classify(x,df['Rev'])) 

und ich tat logische Kontrollen innerhalb der Klassifizierungsfunktion auf dem zweiten Argument, ich diesen Fehler habe:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). 

Was ich suche ist ein Möglichkeit, den zweiten Argumentwert nach Wert zu erfassen, genauso wie Lambda x: den ersten Argumentwert nach Wert erfasst.

Antwort

1

Die obige Methode ist in Ordnung, ich denke, wenn es funktioniert ... Meiner Meinung nach beantwortet es die Frage nicht, weil Sie zwei Argumente in eins verketten.

Ein Weg, dies zu tun, damit Sie zwei Argumente anzuwenden weitergeben müssen:

df['PageCLass'] = df[['PageClass','Rev']].apply(lambda x: PageClassify.page_classify(*x), axis=1) 

Ich weiß nicht, was die page_classify Methode aussieht, aber wenn es zwei Argumente nimmt sollte die oben arbeiten. Geht das für dich?

+0

Ich habe die Methode page_classify so geändert, dass sie zwei Argumente enthält (statt wie oben ein Argument auf der Registerkarte \ t aufzuteilen und das Hauptprogramm mit der Zeile zu ändern): TypeError: ('page_classify() benötigt genau 2 Argumente (120467 gegeben) ', trat bei index PageClass') auf –

+0

Ich habe axis = 1 hinzugefügt und Dinge liefen, aber seltsamerweise meine Zielspalte df ['PageClass'] nicht aktualisiert, dh der zurückgegebene Wert aus der Funktion wurde nicht zugeordnet Es scheint, dass es unverändert ist. –

+0

Guter Ruf, gerade als du dies kommentiert hast, habe ich es ausprobiert und sicher genug, dass df ['blargh'] den zurückgegebenen Wert erhält! Ich frage mich, warum es nicht so war zuweisen "an Ort und Stelle." –

1

Angenommen, Sie wollen nur für Zeile diese Zeile tun, sollten folgende Arbeiten:

df['PageCLass'] = (df['PageClass'] + df['Rev'].apply(str)).apply(lambda x: PageClassify.page_classify(x)) 

Hier werden verketten Sie einfach die beiden Datenrahmen Spalten zusammen und dann können Sie die Funktion auf jede Zeile in der Anwendung neue Spalte. Wenn Sie die Werte von PageClass und Rev als separate Argumente überprüfen müssen, können Sie auch ein Trennzeichen (zB ‚\ t‘) an die Verkettung hinzufügen und dann einfach auf, dass innerhalb der Funktion aufgeteilt:

df['PageCLass'] = (df['PageClass'] + '\t' + df['Rev'].apply(str)).apply(lambda x: PageClassify.page_classify(x)) 

Hope this hilft!

+0

Ich habe das \ t und split innerhalb der Funktion, es funktioniert gut. Dadurch werden die Spalten in "lock-step" für die logische Verarbeitung durch die Funktion abgerufen. –

Verwandte Themen