假设我有一个这样的数据框,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
列
答案 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
。