2017-09-14 2 views
2

Ich habe ein dataframe in Python, die wie das, was, wie durch die Nutzung vorhandener Spalten in Python eine neue Spalte bedingte auf andere Spalte erstellen

dt = pd.DataFrame({"language1": ["english", "english123", "ingles", "ingles123", "14.0", "13", "french"], 
        "language2": ["englesh", "english123", "ingles", "ingles123", "14", "13", "french"], 
        "language3": ["englesh", "engl", "ingles", "ingles123", "14", "13", "spanish"]}) 

sieht Ich möchte tun, replizieren diese R Code aber in python

dt[,language4:=ifelse(!language1%in%c("french"),paste0(language2,"_win"),paste0(language3,"_lose"))] 

habe ich versucht, diese aber es funktioniert nicht

dt['language4'] = dt.apply(lambda x: ~x['language1'].isin(['french']), x['language2'] + "_win", x['language3']+"_lose") 

So kam ich mit diesem

dt.loc[~dt['language1'].isin(["french"]),'language4'] = surv_dt_sd['language2'] + \ 
    "_win" 

, aber ich weiß nicht, wie die else Bit in einer Zeile

Antwort

2

numpy.where arbeiten hier implementieren:

dt['language4'] = np.where("french" not in dt['language1'], dt['language2'] + '_win', dt['language2'] + '_lose') 
+0

Dies funktioniert perfekt. Vielen Dank ! Zu meiner Information, gibt es eine Alternative mit dem '~' Operator und dem 'Isin'? – quant

+1

'~' und 'isin' sind hier nicht die beste Lösung, da es sich im Wesentlichen um einen SQL-Anti-Join handelt (z. B. WHERE NOT IN) und" isin "als Argument eine Liste oder einen Satz verwendet. Wenn Sie mehrere exakte Werte neben "Französisch" hätten, die Sie negieren wollten, könnten Sie '~ dt ['language1']. Isin (['deutsch', 'russisch', 'japanisch'])' als erstes Argument verwenden 'np.where', aber auch das würde nur mit exakten Übereinstimmungen funktionieren. – cmaher

0

I kann auch die "apply + ifelse" -Lösung teilen:

dt['language4'] = dt.apply(lambda x: x['language2'] + "_win" if not('french' in x['language1']) else x['language3']+"_lose", axis=1) 
Verwandte Themen