2013-10-11 43 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()