如果它不包含指定的整数值(Pandas),请删除一行

时间:2017-05-30 05:19:42

标签: python pandas

我有一个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

2 个答案:

答案 0 :(得分:1)

您可以将boolean indexingisin&一起使用:

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_numericerrors='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