簡體   English   中英

DataFrame刪除其列具有特定值的行

[英]DataFrame drop rows whose column has certain values

對於我的問題,我發現了很多條目,這些條目解釋了如何刪除具有特定列值的行。 但是,我無法找到(我知道那里可能有一個帖子)一個帖子,該帖子解決了如何刪除具有多個列中特定列值的數據框中的行(在這種情況下為34)。

  1. 如何刪除某些列中的值為NaN的Pandas DataFrame行
  2. 在DataFrame中按多列標准刪除行
  3. 根據列值在熊貓數據框中刪除行

錯誤數據

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值的行

選項1:

gooddata [gooddata [[['item1','item2'...'item34']]。isin([0,1])]#這使zip的值和年齡NaN; 不知道為什么?

選項2:

gooddata [gooddata [[['item1','item2'...'item34']]。map(len)<2).any(axis = 1)]#也嘗試將'any'替換為'all'; 不工作

選項3:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM