2017-12-18 13 views
1

Ich bin auf der Suche nach dem Äquivalent von R Mutate, mit dem Sie definierte Variablen sofort nach dem Erstellen innerhalb der gleichen Mutate Anruf verweisen können.mit kürzlich erstellten Attributen in Pandas Dataframe zum Erstellen neuer Attribute

new_df <- old_df %>% 
    mutate(new_col = ifelse(something, 0, 1), 
      newer_col = ifelse(new_col == 0, 'yay', 'nay')) 

Suchen Sie nach dem Äquivalent in Python Pandas.

Wenn ich den folgenden Datenrahmen erstelle, frage ich mich, ob es eine Möglichkeit gibt, .assign zu verwenden, um das Gleiche zu tun?

dic = {'names': ['jeff', 'alice', 'steph', 'john'], 
     'numbers':[4, 6, 5, 7]} 

df = pd.DataFrame(dic) 

df = df.assign(less_than_6 = np.where(df.numbers < 6, 100, 0), 
       pass_fail = np.where(df.less_than_6 == 100, 'pass', 'fail')) 

Die Alternative I denken kann ..

df['less_than_6'] = np.where(df.numbers < 6, 100, 0) 
df['pass_fail'] = np.where(df.less_than_6 == 100, 'pass', 'fail') 

aber mich gefragt, ob es eine Möglichkeit, es im selben Aufruf zu tun ist?

+0

funktioniert nicht. Ich bekomme das gleiche "DataFrame" -Objekt hat kein Attribut "less_than_6" wie ich zuvor hatte. danke für den Versuch aber! –

+0

Fügen Sie es als Antwort – Wen

Antwort

2

Mit dict in assign

df.assign(**{'less_than_6' :lambda x : np.where(x['numbers'] < 6, 100, 0)}).assign(**{'pass_fail':lambda x : np.where(x['less_than_6'] == 100, 'pass', 'fail')})                
Out[202]: 
    names numbers less_than_6 pass_fail 
0 jeff  4   100  pass 
1 alice  6   0  fail 
2 steph  5   100  pass 
3 john  7   0  fail 
+0

genial, danke. Kannst du erklären, was '**' tut? –

+1

@MattW. ** ist für Kwargs, Sie können den Link https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.assign.html auch überprüfen, https://stackoverflow.com/questions/2921847/ Was bedeutet der Stern-Operator? – Wen

Verwandte Themen