我有一个像这样的数据框:
>>> o1.columns
Index([1、2、3、4、5、6,'m1','m2',7,'m3',8,'m4',9],dtype ='object')
我想查找仅包含数据且仅在m1,m2,m3和m4中具有数据的行,但其余列为nan或为空。可能吗?我或多或少地尝试了以下内容:
>>> o11=o1[(1==@nan) && (2==@nan) && (3==@nan) && (4==@nan) && (5==@nan) && (6==@nan) && (7==@nan) && (8==@nan) && (9==@nan) && (o1.m1!=@nan) && (o1.m2!=@nan) && (o1.m3!=@nan) && (o1.m4!=@nan)]
但是它不起作用。尝试过“ pd.query也”。也许我缺少非常简单的东西。谢谢你的帮助。 最好的祝福 Zillur
答案 0 :(得分:2)
沿第一个轴调用notna
/ isna
和any
/ all
,然后调用掩码和索引。
cols = ['m1', 'm2', 'm3', 'm4']
diff = df.columns.difference(cols).tolist()
df[df[cols].notna().any(1) & df[diff].isna().all(1)]
这是假设您希望m*
中的所有数据都不为空,反之亦然。
答案 1 :(得分:1)
给出一个数据框df为:
df =
1 2 3 4 5 6 7 8 9 m1 m2 m3 m4
0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
3 NaN 4 NaN NaN NaN NaN NaN NaN NaN 1.5 1.7 1.23 1.6
4 NaN 1 NaN NaN 1 NaN NaN NaN 12 NaN NaN NaN NaN
5 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
6 NaN NaN NaN NaN NaN NaN NaN NaN NaN 1 1.2 1.2 1.5
7 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
8 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
9 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
我们只希望返回索引= 6的行(根据您的要求):
m1 = df[[1,2,3,4,5,6,7,8,9]].isna().sum(axis = 1) == 9
m2 = df[['m1', 'm2', 'm3', 'm4']].isna().sum(axis = 1) == 0
df[m1 & m2]
输出:
1 2 3 4 5 6 7 8 9 m1 m2 m3 m4
6 NaN NaN NaN NaN NaN NaN NaN NaN NaN 1 1.2 1.2 1.5