2013-10-11 44 views
0

我有這樣一個數據幀(它是一個MultiIndexed數據幀我不知道如果我理解正確這...?):大熊貓 - 選擇一個較低的水平在一個數據幀做ffill

df = pd.DataFrame({'index' : range(8), 
'variable1' : ["A","A","B","B","A","B","B","A"], 
'variable2' : ["a","b","a","b","a","b","a","b"], 
'variable3' : ["x","x","x","y","y","y","x","y"], 
'result': [1,0,0,1,1,0,0,1]}) 

df2 = df.pivot_table(values='result',rows='index',cols=['variable1','variable2','variable3']) 

variable1 A    B  
variable2 a  b  a b 
variable3 x y x y x y 
index        
0   1 NaN NaN NaN NaN NaN 
1   NaN NaN 0 NaN NaN NaN 
2   NaN NaN NaN NaN 0 NaN 
3   NaN NaN NaN NaN NaN 1 
4   NaN 1 NaN NaN NaN NaN 
5   NaN NaN NaN NaN NaN 0 
6   NaN NaN NaN NaN 0 NaN 
7   NaN NaN NaN 1 NaN NaN 

現在我想要做的是ffill()的值,但僅限於variable3 == 'y'。期望的結果是:

variable1 A    B  
variable2 a  b  a b 
variable3 x y x y x y 
index        
0   1 NaN NaN NaN NaN NaN 
1   NaN NaN 0 NaN NaN NaN 
2   NaN NaN NaN NaN 0 NaN 
3   NaN NaN NaN NaN NaN 1 
4   NaN 1 NaN NaN NaN 1 
5   NaN 1 NaN NaN NaN 0 
6   NaN 1 NaN NaN 0 0 
7   NaN 1 NaN 1 NaN 0 

我知道我可以通過遍歷variable1variable2,爲他們每個人做這樣的事情做到這一點:

df2['A']['a']['y'].ffill() 

但我想應該有避免的方法這...

回答

1

有點棘手,因爲需要分配結果。

首先交換水平,變量3放在頂部;然後很容易計算並填寫回來。

In [44]: x = df2.swaplevel('variable1','variable3',axis=1) 

In [45]: x['y'] = x['y'].ffill() 

In [46]: x.swaplevel('variable3','variable1',axis=1) 
Out[46]: 
variable1 A    B  
variable2 a  b  a b 
variable3 x y x y x y 
index        
0   1 NaN NaN NaN NaN NaN 
1   NaN NaN 0 NaN NaN NaN 
2   NaN NaN NaN NaN 0 NaN 
3   NaN NaN NaN NaN NaN 1 
4   NaN 1 NaN NaN NaN 1 
5   NaN 1 NaN NaN NaN 0 
6   NaN 1 NaN NaN 0 0 
7   NaN 1 NaN 1 NaN 0 

在0.13(即將推出),你可以做到這一點

選擇子部分,我們希望,並提供drop_level=False它返回作爲一個完整的部分(如不水平,我們是選擇),並填寫它。

In [77]: df_sub = df2.xs('y',level='variable3',axis=1,drop_level=False).ffill() 

In [78]: df_sub 
Out[78]: 
variable1 A  B 
variable2 a b b 
variable3 y y y 
index     
0   NaN NaN NaN 
1   NaN NaN NaN 
2   NaN NaN NaN 
3   NaN NaN 1 
4   1 NaN 1 
5   1 NaN 0 
6   1 NaN 0 
7   1 1 0 

In [79]: df2.loc[:,df_sub.columns] = df_sub 

In [80]: df2 
Out[80]: 
variable1 A    B  
variable2 a  b  a b 
variable3 x y x y x y 
index        
0   1 NaN NaN NaN NaN NaN 
1   NaN NaN 0 NaN NaN NaN 
2   NaN NaN NaN NaN 0 NaN 
3   NaN NaN NaN NaN NaN 1 
4   NaN 1 NaN NaN NaN 1 
5   NaN 1 NaN NaN NaN 0 
6   NaN 1 NaN NaN 0 0 
7   NaN 1 NaN 1 NaN 0 
+0

大。在生產環境中,我正在苦於'AttributeError:_ref_locs',但我想這與......無關。 –

+0

0.12中有一些錯誤導致出現(它與列中的重複項有關)。 – Jeff

0

有可能是因爲大熊貓0.14.0這樣做的更好的辦法:

df2.loc[:, (slice(None), slice(None), 'y')] = df2.loc[:, (slice(None), slice(None), 'y')].ffill()

idx = pd.IndexSlice df2.loc[:, (idx[:,:,'y'])] = df2.loc[:, (idx[:,:,'y'])].ffill()