如果所有值都等于字符串值,则删除列

时间:2017-03-22 15:50:00

标签: python pandas dataframe

假设我有一个这样的数据框,df

Date      Time Black Carbon Carbon monoxide  PM10                    Particulate matter
0  19/10/2015  01:00:00      No data         No data                 No data   
1  19/10/2015  02:00:00      No data         No data                 No data   
2  19/10/2015  03:00:00      10              No data                 No data   
3  19/10/2015  04:00:00      No data         11 .                    No data   
4  19/10/2015  05:00:00      No data         No data                 No data 

我可以通过以下方式删除所有na列:

tmp_df= df.dropna(axis=1,how='all')

但是,我希望删除一个列,条件是每行包含一个字符串No data

在这种情况下,我们会移除Particulate matter

2 个答案:

答案 0 :(得分:4)

您希望列不是所有列都等于No data

df.loc[:, ~(df.astype(str) == 'No data').all()]

输出

                  Date Time Black Carbon Carbon monoxide     PM10
0 19/10/2015  01:00:00                           No data  No data
1 19/10/2015  02:00:00                           No data  No data
2 19/10/2015  03:00:00                                10  No data
3 19/10/2015  04:00:00                           No data     11 .
4 19/10/2015  05:00:00                           No data  No data

答案 1 :(得分:1)

或者,您可以这样做:

df.loc[:, ~df.apply(lambda x: x.nunique() == 1 and x[0]=='No data', axis=0)]

i)检查列中是否只有一个元素使用nunique和ii)列的第一个元素是否等于你的字符串。

演示:

df1 = pd.DataFrame(np.random.randn(3,3), columns=list('abc'))
df1['d'] = 'No data'
df1['e'] = ['No data', 0, 'No data']

          a         b         c        d        e
0 -0.441122  3.499830 -0.161578  No data  No data
1  1.683904  0.217083 -1.167220  No data        0
2 -1.143193 -0.386444 -0.403479  No data  No data

然后

df1.loc[:, ~df1.apply(lambda x: x.nunique() == 1 and x[0]=='No data', axis=0)]

返回

          a         b         c        e
0 -0.441122  3.499830 -0.161578  No data
1  1.683904  0.217083 -1.167220        0
2 -1.143193 -0.386444 -0.403479  No data

编辑:

作为@Ted Petrou的回答:

df1.loc[:, ~(df1.values == 'No data').all(axis=0)]

但是,我不知道将所有值转换为字符串是否更有效,就像在答案中一样,或仅使用.values

相关问题