从pandas中的多级DF中检索非空值,并组合多个列

时间:2017-02-28 10:24:21

标签: python pandas dataframe

我有一个数据框,我希望按子列进行过滤,只考虑列a + bc + {{1},检索它们存在的非空值}}。例如:

d

我的想法是在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 + ab + c,然后检索两列(dx)具有已编译的数据。请注意,某些行可能只有y列(NaN的行4就是这种情况)。在这些情况下,我想要A

我认为我可以使用像

这样的东西
NaN

所需的输出是:

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

1 个答案:

答案 0 :(得分:1)

您可以combine_first使用fillnaxs选择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