[英]Drop rows in dataframe whose column has more than a certain number of distinct values
[英]DataFrame drop rows whose column has certain values
对于我的问题,我发现了很多条目,这些条目解释了如何删除具有特定列值的行。 但是,我无法找到(我知道那里可能有一个帖子)一个帖子,该帖子解决了如何删除具有多个列中特定列值的数据框中的行(在这种情况下为34)。
错误数据
zip age item1 item2 item3 item4 item5 item6 item7 item34
12345 10 1 0 1 1 0 0 1 0
23456 20 10 111 11 1 0 1 9 8
45678 60 1 0 1 1 0 1 0 1
我想保留所有具有'1'或'0'值的行(删除所有34 cols中的col值不是'1'或'0'的行)。 这是我到目前为止尝试过的:
baddata = pd.DataFrame(数据=脏数据,列= ['zip','age','item1','item2'...'item34'])
gooddata = baddata.dropna()#有些行具有NaN; 删除具有NaN值的行
gooddata [gooddata [[['item1','item2'...'item34']]。isin([0,1])]#这使zip的值和年龄NaN; 不知道为什么?
gooddata [gooddata [[['item1','item2'...'item34']]。map(len)<2).any(axis = 1)]#也尝试将'any'替换为'all'; 不工作
cols_of_interest = ['item1','item2'...'item34'] gooddata [gooddata.drop(gooddata [cols_of_interest] .map(len)<2)]#对函数的语法和用法表示怀疑
从选择age
后的所有列age
df[df.columns[2:]]
item1 item2 item3 item4 item5 item6 item7 item34
0 1 0 1 1 0 0 1 0
1 10 111 11 1 0 1 9 8
2 1 0 1 1 0 1 0 1
检查它们的值是0还是1
df[df.columns[2:]].isin((0, 1))
item1 item2 item3 item4 item5 item6 item7 item34
0 True True True True True True True True
1 False False False True True True False False
2 True True True True True True True True
检查行中的所有值是否均为True
df[df.columns[2:]].isin((0, 1)).all(axis=1)
0 True
1 False
2 True
dtype: bool
仅选择这些行
df[df[df.columns[2:]].isin((0, 1)).all(axis=1)]
zip age item1 item2 item3 item4 item5 item6 item7 item34
0 12345 10 1 0 1 1 0 0 1 0
2 45678 60 1 0 1 1 0 1 0 1
编辑
更清楚地说明这一点,我们有
relevant_columns = df[df.columns[2:]]
values_as_ints = relevant_columns.convert_objects(convert_numeric=True)
values_valid = values_as_ints.isin((0, 1))
row_valid = values_valid.all(axis=1)
good_rows = df[row_valid]
尝试这个:
print df
zip age item1 item2 item3 item4 item5 item6 item7 item34
12345 10 1 0 1 1 0 0 1 0
23456 20 10 111 11 1 0 1 9 8
45678 60 1 0 1 1 0 1 0 1
dfSlice = df[df.columns[2:]]
def mapZeroOne(x):
if x == 0 or x == 1:
return x
dfNa = dfSlice.applymap(mapZeroOne)
print dfNa
item1 item2 item3 item4 item5 item6 item7 item34
12345 1.0 0.0 1.0 1 0 0 1.0 0.0
23456 NaN NaN NaN 1 0 1 NaN NaN
45678 1.0 0.0 1.0 1 0 1 0.0 1.0
dfAge = df[['zip',"age"]]
print dfAge
zip age
12345 10
23456 20
45678 60
df_new = pd.concat([dfAge, dfNa], axis=1)
print df_new
zip age item1 item2 item3 item4 item5 item6 item7 item34
12345 10 1.0 0.0 1.0 1 0 0 1.0 0.0
23456 20 NaN NaN NaN 1 0 1 NaN NaN
45678 60 1.0 0.0 1.0 1 0 1 0.0 1.0
print df_new.dropna()
zip age item1 item2 item3 item4 item5 item6 item7 item34
12345 10 1.0 0.0 1.0 1 0 0 1.0 0.0
45678 60 1.0 0.0 1.0 1 0 1 0.0 1.0
您可能需要将0调整为“ 0”,将1调整为“ 1”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.