2016-07-21 10 views
1

Ich habe ein Pandas-Datenframe und ich muss eine neue Spalte basierend auf einem If-sonst-Bedingung erstellen. Diese Frage ist hier bereits mehrfach aufgetreten (z. B. Creating a new column based on if-elif-else condition).Erstellen Sie neue Pandas Dataframe Spalte basierend auf If-Else-Bedingung mit einem Lookup

Allerdings kann ich die vorgeschlagene Lösung nicht anwenden, da ich auch Werte in einer Liste nachschlagen muss, um den Zustand zu überprüfen. Ich kann das mit der vorgeschlagenen Lösung nicht machen, weil ich mir nicht sicher bin, wie ich in der externen Funktion auf meine Lookup-Liste zugreifen kann. Meine Lookup-Liste müsste global sein, was ich vermeiden möchte. Ich habe das Gefühl, dass es einen besseren Weg geben sollte, dies zu tun.

Betrachten Sie die folgende Datenrahmen df:

letters 
A 
B 
C 
D 
E 
F 

Ich habe auch eine Liste, die Lookup-Werte enthält:

lookup = [C,D] 

Nun, ich möchte eine neue Spalte in meinem Datenrahmen zu schaffen, die 1 enthält, wenn der entsprechende Wert ist in lookup und 0 enthalten, wenn die Werte nicht in lookup sind.

würde Der typische Ansatz sein: Ich weiß nicht, aber

df.apply(helper, axis=1) 

def helper(row): 
    if(row['letters'].isin(lookup)): 
    row['result'] = 1 
    else: 
    row['result'] = 0 

, wie ich lookup in helper() ohne es global zu machen zugreifen kann.

Das Ergebnis sollte wie folgt aussehen:

letters result 
A   0 
B   0 
C   1 
D   1 
E   0 
F   0 
+3

Dies zu diesem sehr ähnlich ist: http://stackoverflow.com/questions/38499890/how-to-use-pandas-apply- function-on-all-spalten-von-einigen-reihen-von-datenframe müssen Sie nur tun 'df.loc [df ['buchstaben']. isin (lookup), 'result'] = 1' – EdChum

+1

Or vollständiger ist 'df ['result'] = np.where (df ['letters']. isin (lookup), 1, 0)' – EdChum

Antwort

1

Obwohl diese Frage auf die Frage sehr ähnlich ist: How to use pandas apply function on all columns of some rows of data frame

Ich denke, hier lohnt es sich, ein paar Methoden, auf einer einzigen Zeile zeigt mit np.where mit eine boolean Maske aus isin erzeugt wird isin eine boolean-Serie zurück, wo alle Zeilen keine Treffer in der Liste enthalten:

In [71]: 
lookup = ['C','D'] 
df['result'] = np.where(df['letters'].isin(lookup), 1, 0) 
df 

Out[71]: 
    letters result 
0  A  0 
1  B  0 
2  C  1 
3  D  1 
4  E  0 
5  F  0 

hier mit 2 loc Aussagen und mit ~ die Maske invertieren:

In [72]: 
df.loc[df['letters'].isin(lookup),'result'] = 1 
df.loc[~df['letters'].isin(lookup),'result'] = 0 
df 

Out[72]: 
    letters result 
0  A  0 
1  B  0 
2  C  1 
3  D  1 
4  E  0 
5  F  0 
Verwandte Themen