2017-02-21 6 views
1

Ich bin neugierig, ob es möglich ist, mehrere Funktionen auf eine Pandas Dataframe Spalte anzuwenden. Zum Beispiel, sagen wir mal, dass ich drei Funktionen haben:Wie man mehrere Funktionen auf eine Pandas Dataframe Spalte anwendet?

In:

def foo(col): 
    if 'hi' in col: 
     return 'TRUE' 

def bar(col): 
    if 'bye' in col: 
     return 'TRUE' 

def baz(col): 
    if 'ok' in col: 
     return 'TRUE' 

und die folgenden Datenrahmen:

dfs = pd.DataFrame({'col':['The quick hi brown fox hi jumps over the lazy dog', 
          'The quick hi brown fox bye jumps over the lazy dog', 
          'The NO quick brown fox ok jumps bye over the lazy dog']}) 

Wenn ich möchte jede Funktion auf col anzuwenden, in der Regel I wird die Pandas apply Funktion:

dfs['new_col1'] = dfs['col'].apply(foo) 

dfs['new_col2'] = dfs['col'].apply(bar) 

dfs['new_col3'] = dfs['col'].apply(baz) 

dfs 

Out:

col  new_col1 new_col2 new_col3 
0 The quick hi brown fox hi jumps over the lazy dog TRUE None None 
1 The quick hi brown fox bye jumps over the lazy... TRUE TRUE None 
2 The NO quick brown fox ok jumps bye over the l... None TRUE TRUE 

Wie Sie jedoch sehen können, habe ich 3 Spalten erstellt. Also, meine Frage ist, wie man die oben genannten 3 Funktionen in großen Datenrahmen gleichzeitig effizient auf eine bestimmte Spalte anwenden? sollte das erwartete Ergebnis sein:

col             new_col 
0 The quick hi brown fox hi jumps over the lazy dog TRUE 
1 The quick hi brown fox bye jumps over the lazy... TRUE, TRUE 
2 The NO quick brown fox ok jumps bye over the l... TRUE, TRUE 

Bitte beachte, dass ich weiß, dass ich die drei Spalten in einem einzigen verschmelzen kann. Trotzdem würde ich gerne wissen, ob die obige Frage möglich ist.

Antwort

2

Sie können apply mit list comprehension verwenden, wo Filter None Werte:

dfs['new_col'] = dfs['col'].apply(lambda x: (', '.join([x for x in 
              [foo(x), bar(x), baz(x)] if x != None]))) 
print (dfs) 
               col  new_col 
0 The quick hi brown fox hi jumps over the lazy dog  TRUE 
1 The quick hi brown fox bye jumps over the lazy... TRUE, TRUE 
2 The NO quick brown fox ok jumps bye over the l... TRUE, TRUE 
+0

Danke, in Bezug auf die Leistung ist das optimal? –

+1

Es hängt von Ihren Funktionen ab ... Das Beste ist es zu testen. – jezrael

+1

@ J.Do nein, ich denke nicht, dass es schneller sein wird als die kombinierte Funktion. Hier sind zu viele Schritte: 3 Funktionsaufrufe, .join, eine andere if-Anweisung und apply. – AsheKetchum

4

Warum nicht alle Funktionen zu einer einzigen Funktion zusammenfassen?

def oneGaintFunc(col):  
    def foo(col): 
     if 'hi' in col: 
      return 'TRUE' 

    def bar(col): 
     if 'bye' in col: 
      return 'TRUE' 

    def baz(col): 
     if 'ok' in col: 
      return 'TRUE' 

    a = foo(col) 
    b = bar(col) 
    c = baz(col) 
    return '{} {} {}'.format(a, b, c) 

df['new_col'] = df['col'].apply(oneGiantFunc) 
+0

Ich war auch über diese Möglichkeit bewusst. Ich war jedoch neugierig auf den oben genannten Fall. Danke –

+1

das ist nicht der richtige Weg, aber immer noch eine gute Idee für kleinere Funktionen –

+1

@AnkitKumarNamdeo Ja, ich persönlich würde dies nicht tun, aber nur gedacht, das wäre die intuitivste Lösung, ehrlich gesagt. – spicypumpkin

1

ich Sie nicht denken, kann es tatsächlich tun 'zugleich'. Aber trotzdem hier sind zwei Optionen

1. die Funktionen unter der Annahme definiert sind, wie:

dfs['new_col1'] = (dfs['col'].apply(foo)&dfs['col'].apply(bar))&dfs['col'].apply(baz) 

2. Neudefinition Funktionen

def foo(aao): # all at once 
    if ('hi' in col) and ('bye' in col) and ('ok' in col): 
     return 'TRUE' 

dfs['new_col'] = dfs['col'].apply(aao) 
1

Verwenden Sie eine Lambda-Funktion, z.B.

lambda x: ', '.join([f(x) for f in [foo, bar, baz] if f(x)]) 

im Aufruf zutreffen. Vollständiges Beispiel:

In : dfs['new_col'] = dfs['col'].apply(lambda x: ', '.join([f(x) for f in [foo, bar, baz] if f(x)])) 

In : dfs 
Out: 
               col  new_col 
0 The quick hi brown fox hi jumps over the lazy dog  TRUE 
1 The quick hi brown fox bye jumps over the lazy... TRUE, TRUE 
2 The NO quick brown fox ok jumps bye over the l... TRUE, TRUE 
Verwandte Themen