DataFrame删除列具有特定值的行

时间:2016-06-05 02:10:17

标签: python dataframe

对于我的问题,我发现了很多条目,解释了如何删除具有特定列值的行;但是,我找不到(我知道帖子可能在那里)一篇帖子,该帖子解决了如何在数据框中删除具有跨多列的特定列值的行(在本例中为34)。

  1. How to drop rows of Pandas DataFrame whose value in certain columns is NaN
  2. Drop Rows by Multiple Column Criteria in DataFrame
  3. Drop rows in pandas dataframe based on columns value
  4. 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值的行

    选项-1:

    gooddata [gooddata [['item1','item2'...'item34']]。isin([0,1])]#这会生成zip和年龄NaN的值;不确定为什么?

    选项-2:

    gooddata [gooddata [['item1','item2'...'item34']]。map(len)< 2).any(axis = 1)]#还尝试用'all'替换'any';没用?

    选项-3:

    cols_of_interest = [ 'ITEM1', 'ITEM2' ... 'item34'] gooddata [gooddata.drop(gooddata [cols_of_interest] .map(len)< 2)] #doubtful关于函数的语法和用法

2 个答案:

答案 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”。