从df子集中删除某些行

时间:2019-05-24 06:26:51

标签: python pandas

我有一个熊猫数据框。第2列右边的所有列只能包含值0或1。如果它们包含的值不是0或1,我想从数据框中删除整行。

所以我创建了数据框的子集,只包含#2列 然后,我发现具有非0或1值的行的索引,并将其从原始数据框中删除。

请参见下面的代码

#reading data file:
data=pd.read_csv('MyData.csv')

#all the columns right of column#2 may only contain the value 0 or 1. So "prod" is a subset of the data df containing these columns:

prod = data.iloc[:,2:]
index_prod = prod[ (prod!= 0) & (prod!= 1)].dropna().index
data = data.drop(index_prod)

但是,当我运行此命令时,index_prod向量为空,因此根本不会删除任何东西。

2 个答案:

答案 0 :(得分:1)

  

好的,所以我的朋友只是告诉我数据不是数字,他通过将其设置为数字来对其进行了修复。谁能告诉我如何找到答案?因为所有列都是数字,所以在我看来。所有数字

您可以通过DataFrame.dtypes检查dtypes。

print (data.dtypes)

或者:

print (data.columns.difference(data.select_dtypes(np.number).columns))

然后将所有值(不包括前2个)转换为数字:

data.iloc[:,2:] = data.iloc[:,2:].apply(lambda x: pd.to_numeric(x, errors='coerce'))

或所有列:

data = data.apply(lambda x: pd.to_numeric(x, errors='coerce'))

最后一次应用解决方案:

subset = data.iloc[:,2:]
data1 = data[subset.isin([0,1]).all(axis=1)]

答案 1 :(得分:0)

假设您有此数据框:

data = {'A': [1, 2, 3, 4, 5], 'B': [0, 1, 4, 3, 1], 'C': [2, 1, 0, 3, 4]}
df = pd.DataFrame(data)

   A  B  C
0  1  0  2
1  2  1  1
2  3  4  0
3  4  3  3
4  5  1  4

并且您要删除基于列 B 的行,其中不包含 0或1 ,我们可以通过以下方式来实现:

subset = df.iloc[:,1:]
index = subset[ (subset!= 0) & (subset!= 1)].dropna().index

df.drop(index)
   A  B  C
0  1  0  2
1  2  1  1
4  5  1  4

df.reset_index(drop=True)
   A  B  C
0  1  0  2
1  2  1  1
2  5  1  4