2017-02-28 52 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