繁体   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