熊猫:按多列中的值过滤

时间:2017-06-07 14:52:20

标签: python pandas filter

我正在尝试根据单个条件中的多个列中的值过滤数据帧,但保留其他列,我根本不想应用过滤器。

我已经回顾了这些答案,第三个是最接近的,但仍然没有运气:

设定:

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列表中)。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分: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