我有一个Pandas数据集,我想在应用ML算法之前清理它。我想知道如果其列的元素与一组值不匹配,是否可以删除一行。例如,如果我有数据帧:
a b
0 1 6
1 4 7
2 2 4
3 3 7
...
我希望a
的值为[1,3]
和b
之一为[6,7]
之一,这样我的最终数据集就是:
a b
0 1 6
1 3 7
...
目前,我的实现无法正常工作,因为我的某些数据行的值附加了错误的字符串。例如,1
的值不是1abc
,而是a
。因此,为什么我要删除任何不是该值的整数的东西。
我的解决方法也有点陈旧,因为我删除了没有1或3通道的列dataset = dataset[(dataset.commute != 1)]
dataset = dataset[(dataset.commute != 3)]
的条目:
null
答案 0 :(得分:1)
您可以将boolean indexing
与isin
和&
一起使用:
df1 = df[(df['a'].isin([1,3])) & (df['b'].isin([6,7]))]
print (df1)
a b
0 1 6
3 3 7
或使用numpy.in1d
:
df1 = df[(np.in1d(df['a'], [1,3])) & (np.in1d(df['b'], [6,7])) ]
print (df1)
a b
0 1 6
3 3 7
但是如果需要删除所有非数字行,则需要to_numeric
并errors='coerce'
返回NaN
,然后可以按notnull
过滤它:
df = pd.DataFrame({'a':['1abc','2','3'],
'b':['4','5','dsws7']})
print (df)
a b
0 1abc 4
1 2 5
2 3 dsws7
mask = pd.to_numeric(df['a'], errors='coerce').notnull() &
pd.to_numeric(df['b'], errors='coerce').notnull()
df1 = df[mask].astype(int)
print (df1)
a b
1 2 5
如果需要检查某些值是NaN
还是None
:
df = pd.DataFrame({'a':['1abc',None,'3'],
'b':['4','5',np.nan]})
print (df)
a b
0 1abc 4
1 None 5
2 3 NaN
print (df[df.isnull().any(axis=1)])
a b
1 None 5
2 3 NaN
答案 1 :(得分:0)
您可以使用pandas isin()
df = df[df.a.isin([1,3]) & df.b.isin([6,7])]
a b
0 1 6
3 3 7