2017-02-28 54 views
0

我有一个数据帧,我想由子栏以过滤,检索,他们考虑列a + b只存在非空值,并且c + d 。例如:检索从多级DF非空值的大熊猫,并结合多列

df = pd.DataFrame({('A','a'): [-1,-1,NaN,10,NaN], 
        ('A','b'): [0,1,NaN,3,NaN], 
        ('A','c'): [NaN,NaN,0,NaN,NaN], 
        ('A','d'): [NaN,NaN,2,NaN,NaN], 
        ('B','a'): [NaN,NaN,0,NaN,NaN], 
        ('B','b'): [NaN,NaN,0,NaN,NaN], 
        ('B','c'): [NaN,-10,NaN,10,20], 
        ('B','d'): [NaN,-100,NaN,100,200] 
}) 

#out 
    A      B      
    a  b  c d  a  b  c  d 
0 -1.0 0.0 NaN NaN NaN NaN NaN NaN 
1 -1.0 1.0 NaN NaN NaN NaN 2.0 0.0 
2 NaN NaN 0.0 2.0 0.0 0.0 NaN NaN 
3 10.0 3.0 NaN NaN NaN NaN 10.0 100.0 
4 NaN NaN NaN NaN NaN NaN 20.0 200.0 

我的想法是A下搜索具有非空值的列a + b,并c + d和检索两列(xy)是有编制的数据。请注意,有些行的列可能只有NaN(这是的行4的情况)。在这些情况下,我想有一个NaN

我认为我将能够开始使用类似

pfilter=prefilesdf.notnull() 
colfilter=pfilter.reindex(columns = df.columns, level=0) 
out=df.mask(colfilter) 

它所需的输出将是:

A   B      
    x y  x y 
0 -1.0 0.0 NaN NaN 
1 -1.0 1.0 2.0 0.0 
2 0.0 2.0 0.0 0.0 
3 10.0 3.0 10.0 100.0 
4 NaN NaN 20.0 200.0 

回答

1

您可以通过xs使用combine_firstfillna选定df

d = {'a':'L1','b':'L1','c':'L2','d':'L2'} 
df.columns = pd.MultiIndex.from_arrays([df.columns.get_level_values(0), 
             df.columns.get_level_values(1).map(lambda x: d[x]), 
             df.columns.get_level_values(1)]) 
print (df) 
     A     B     
    L1  L2  L1   L2  
     a b c d a b  c  d 
0 -1.0 0.0 NaN NaN NaN NaN NaN NaN 
1 -1.0 1.0 NaN NaN NaN NaN -10.0 -100.0 
2 NaN NaN 0.0 2.0 0.0 0.0 NaN NaN 
3 10.0 3.0 NaN NaN NaN NaN 10.0 100.0 
4 NaN NaN NaN NaN NaN NaN 20.0 200.0 
df1 = df.xs('L1', axis=1, level=1) 
df2 = df.xs('L2', axis=1, level=1).rename(columns={'c':'a','d':'b'}) 

print (df1) 

     A   B  
     a b a b 
0 -1.0 0.0 NaN NaN 
1 -1.0 1.0 NaN NaN 
2 NaN NaN 0.0 0.0 
3 10.0 3.0 NaN NaN 
4 NaN NaN NaN NaN 

print (df2) 
    A   B  
    a b  a  b 
0 NaN NaN NaN NaN 
1 NaN NaN -10.0 -100.0 
2 0.0 2.0 NaN NaN 
3 NaN NaN 10.0 100.0 

print (df1.combine_first(df2)) 
     A   B  
     a b  a  b 
0 -1.0 0.0 NaN NaN 
1 -1.0 1.0 -10.0 -100.0 
2 0.0 2.0 0.0 0.0 
3 10.0 3.0 10.0 100.0 
4 NaN NaN 20.0 200.0