[英]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.