2016-08-23 77 views
0

我一直被困在熊貓的問題上,我似乎無法弄清楚。 我有這樣一個數據幀:熊貓將函數應用於列中的唯一值

ref, value, rule, result, new_column 
a100, 25, high, fail, nan 
a100, 25, high, pass, nan 
a100, 25, medium, fail, nan 
a100, 25, medium, pass, nan 
a101, 15, high, fail, nan 
a101, 15, high, pass, nan 
a102, 20, high, pass, nan 

我想一個新列添加到該數據框與下面的僞代碼

對於裁判的每個唯一值,如果result = fail,然後new_column = no爲所有後續行相同的「ref」值。

這就是新數據框的外觀。

ref, value, rule, result, new_column 
a100, 25, high, fail, no 
a100, 25, high, pass, no 
a100, 25, medium, fail, no 
a100, 25, medium, pass, no 
a101, 15, high, fail, no 
a101, 15, high, pass, no 
a102, 20, high, pass, yes 

我所能夠做到的是:

ref, value, rule, result, new_column 
a100, 25, high, fail, no 
a100, 25, high, pass, yes 

這是通過df.loc函數來實現。 但我需要的功能適用於唯一值,而不是每一行。

+0

你認爲'NEW_COLUMN = no'或'yes'? – jezrael

+1

您是否可以向數據框添加更多行,因爲我認爲這對我來說有點不清楚。 – jezrael

+0

@jezrael更新,請檢查。對於每個唯一參考值,result = fail的所有實例均爲new_column = no。 – Kvothe

回答

3

我認爲你可以使用transform

print (df) 
    ref value rule result new_column 
0 a100  25 high pass   NaN 
1 a100  25 high fail   NaN 
2 a100  25 medium fail   NaN 
3 a100  25 medium pass   NaN 
4 a101  15 high fail   NaN 
5 a101  15 high pass   NaN 
6 a102  20 high pass   NaN 

df['new_column']=df.groupby('ref')['result'] 
        .transform(lambda x: 'no' if ((x=='fail').any()) else 'yes') 
print (df) 
    ref value rule result new_column 
0 a100  25 high pass   no 
1 a100  25 high fail   no 
2 a100  25 medium fail   no 
3 a100  25 medium pass   no 
4 a101  15 high fail   no 
5 a101  15 high pass   no 
6 a102  20 high pass  yes 

謝謝Jon Clementsreplace另一種解決方案:

df['new_column'] = df.groupby('ref')['result'] 
        .transform(lambda L: (L == 'fail').any()) 
        .replace({True: 'no', False: 'yes'}) 

print (df) 
    ref value rule result new_column 
0 a100  25 high pass   no 
1 a100  25 high fail   no 
2 a100  25 medium fail   no 
3 a100  25 medium pass   no 
4 a101  15 high fail   no 
5 a101  15 high pass   no 
6 a102  20 high pass  yes 
+0

嗯......我有'df.groupby('ref')['result'] .transform(lambda L:(L =='fail')。any())。replace({True:'no', False:'yes'})' –

+0

@JonClements - 謝謝。 – jezrael

+0

@jezrael非常感謝!這正是我想要的:) – Kvothe