2016-11-05 57 views
3

試圖用系列值更新數據幀的一部分。通過廣播系列更新數據幀值

np.random.seed(1) 
df = pd.DataFrame(np.random.randint(1,100,(5,5)),columns =list('ABCDE')) 
print df 


    A B C D E 
0 38 13 73 10 76 
1 6 80 65 17 2 
2 77 72 7 26 51 
3 21 19 85 12 29 
4 30 15 51 69 88 

與一系列:

ser = pd.Series(index =list('CBADE'),data = range(-5,0)) 

C -5 
B -4 
A -3 
D -2 
E -1 
dtype: int64 

讓作爲切片用於更新

criteria = df['A'] < 25 

criteria: 
0 False 
1  True 
2 False 
3  True 
4 False 

嘗試:

df[criteria] = ser 
df.loc[criteria,:] = ser 
etc. 

期望的輸出:

 A B C D E 
0 38 13 73 10 76 
1 -3 -4 -5 -2 -1 
2 77 72 7 26 51 
3 -3 -4 -5 -2 -1 
4 30 15 51 69 88 

我想兌現列索引和忽略行索引,使用布爾條件和廣播。

回答

2

可以fillna一系列
你可以讓你dfnp.nanmask
這工作

df.mask(criteria).fillna(ser) 

enter image description here


+0

非常好的解決方案 - 我沒有想到爲這個任務使用'mask' – MaxU

+0

我選擇了這個解決方案,因爲它是純粹的熊貓解決方案,但願意重新考慮。 MaxU你覺得怎麼樣? – Dickster

4

你可以試試這個:

df.loc[criteria, ser.index] = ser[np.newaxis, :] 

這可以確保適當的廣播(通過np.newaxis)和列索引很榮幸(通過指定ser.index)。

+0

哇!這很聰明! – MaxU

+0

是的,這很酷 - 謝謝。我所做的事情是將我的值設置爲0.0,然後利用.add()方法廣播很好,儘管有點瘋狂,因爲我需要一個簡單的設置選項。 – Dickster