对于我的问题,我发现了很多条目,解释了如何删除具有特定列值的行;但是,我找不到(我知道帖子可能在那里)一篇帖子,该帖子解决了如何在数据框中删除具有跨多列的特定列值的行(在本例中为34)。
baddata
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列中col值不是'1'或'0'的所有行)。这是我到目前为止所尝试的:
baddata = pd.DataFrame(data = dirtydata,columns = ['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)]#还尝试用'all'替换'any';没用?
cols_of_interest = [ 'ITEM1', 'ITEM2' ... 'item34'] gooddata [gooddata.drop(gooddata [cols_of_interest] .map(len)< 2)] #doubtful关于函数的语法和用法
答案 0 :(得分:0)
首先选择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]
答案 1 :(得分:0)
试试这个:
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”。