我有一个包含100列的数据框,其中第一列是唯一标识符,第二列是它们所属的组,列的其余部分解释了每个用户的特征。
user_id, group_id, a, b, c,....,az
0001, 1, 23, pro, 5.5, ......, 234
0002, 1, 32, che, 3.3, ......, 342
0003, 2, NaN, NaN, NaN,......., NaN
除了第1列和第2列(NaN
,user_id
)
group_id
(s)所有列的所有记录进行子集化
一种方法是:
df[df['a'].notnull() & (df['b'].notnull()) & (df['c'].notnull())]
但是写这样的98列似乎是不合适的。有没有更好的办法?
答案 0 :(得分:5)
In [197]: df[df.iloc[:, 2:].notna().all(1)]
Out[197]:
user_id group_id a b c az
0 1 1 23.0 pro 5.5 234.0
1 2 1 32.0 che 3.3 342.0
如果user_id
和group_id
始终设置且永远不会是NaN:
In [205]: df[df.notna().sum(1).gt(2)]
Out[205]:
user_id group_id a b c az
0 1 1 23.0 pro 5.5 234.0
1 2 1 32.0 che 3.3 342.0
PS较旧的Pandas版本没有DataFrame.notna()
方法 - 在这种情况下使用DataFrame..notnull()
方法
<强>更新强>
选择除前两个列之外的所有列都具有所有NAN
值的行:
In [215]: df[df.iloc[:, 2:].isnull().all(1)]
Out[215]:
user_id group_id a b c az
2 3 2 NaN NaN NaN NaN
答案 1 :(得分:4)
您可以首先删除user_id
和group_id
列,测试空值,然后测试子集:
df[df.drop(['user_id', 'group_id'], axis=1).notnull().all(axis=1)]
# user_id group_id a b c az
#0 1 1 23.0 pro 5.5 234.0
#1 2 1 32.0 che 3.3 342.0
或者如果两列&#39;职位固定为0和1:
df[df.iloc[:,2:].notnull().all(axis=1)]
答案 2 :(得分:3)
我将使用dropna
+ thresh
,基本上它会添加每行NaN数的容差。
df.dropna(axis=0,thresh=df.shape[1]-2)
Out[101]:
user_id group_id a b c az
0 1 1 23 pro 5.5 234
1 2 1 32 che 3.3 342