2017-06-07 204 views
3

我想基于单个条件筛选基于多列中的值的数据框,但保留其他不适用于其他列的筛选条件所有。熊猫:按多个列中的值进行筛选

我查看了这些问题的答案,与第三是最接近的,但仍没有运气:

设置:

import pandas as pd 

df = pd.DataFrame({ 
     'month':[1,1,1,2,2], 
     'a':['A','A','A','A','NONE'], 
     'b':['B','B','B','B','B'], 
     'c':['C','C','C','NONE','NONE'] 
    }, columns = ['month','a','b','c']) 

l = ['month','a','c'] 
df = df.loc[df['month'] == df['month'].max(), df.columns.isin(l)].reset_index(drop = True) 

电流输出:

month  a  c 
0  2  A NONE 
1  2 NONE NONE 

所需的输出:

month  a 
0  2  A 
1  2 NONE 

我已经试过:

sub = l[1:] 
df = df[(df.loc[:, sub] != 'NONE').any(axis = 1)] 

和许多其他变化(.all()[sub, :]~df.loc[...],(axis = 0)),但都没有运气。

基本上我想删除所有'NONE'值的列(位于sub列表中)。

任何帮助,非常感谢。

回答

3

首先,您希望您的'NONE'np.nan替代,使其识别为dropna空值。然后将loc用于布尔序列和列子集。然后使用dropnaaxis=1how='all'

df.replace('NONE', np.nan) \ 
    .loc[df.month == df.month.max(), l].dropna(axis=1, how='all') 

    month  a 
3  2  A 
4  2 NONE 
+0

所以之前的“电流输出”的一部分,我很高兴一切。实际上,'l = []'会比几个条目长得多,'sub'只是'l'减去前几个条目。它正在筛选列中的'NONE'值,而不是列名本身,我遇到了问题。 – pshep123

+0

只是在我的问题中增加了一点颜色:“基本上我想删除其中包含所有'NONE'值的任何列(在'sub'列表中)。” – pshep123

+0

@ pshep123现在了解。 thx – piRSquared