我有一个数据框,我希望按子列进行过滤,只考虑列a
+ b
和c
+ {{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
+ a
和b
+ c
,然后检索两列(d
和x
)具有已编译的数据。请注意,某些行可能只有y
列(NaN
的行4
就是这种情况)。在这些情况下,我想要A
。
我认为我可以使用像
这样的东西NaN
所需的输出是:
pfilter=prefilesdf.notnull()
colfilter=pfilter.reindex(columns = df.columns, level=0)
out=df.mask(colfilter)
答案 0 :(得分:1)
您可以combine_first
使用fillna
或xs
选择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