我有一个熊猫数据框。第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向量为空,因此根本不会删除任何东西。
答案 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