2017-12-18 149 views
1

我正在尋找相當於R的mutate,它允許您在創建它們之後立即引用已定義的變量在相同的mutate調用內。在熊貓數據框中使用最近創建的屬性來創建新屬性

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

在python熊貓中尋找等價物。

如果我創建了以下數據框,我想知道是否有一種方法可以使用.assign來做同樣的事情?

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')) 

我能想到的是替代..

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

,但不知道是否有辦法做到這一點在同一個電話嗎?

+0

使用字典不起作用。我得到了同樣的''DataFrame'對象沒有屬性'less_than_6',就像我以前一樣。謝謝你的嘗試,但! –

+0

添加它作爲答案 – Wen

回答

2

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

真棒,謝謝。你能解釋一下'**'在做什麼嗎? –

+1

@MattW。 **是爲kwargs,你可以檢查鏈接https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.assign.html也,https://stackoverflow.com/questions/2921847/什麼此結果的星級操作員平均 – Wen