首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >熊猫用单一标准过滤多列

问熊猫用单一标准过滤多列
EN

Stack Overflow用户
提问于 2016-10-25 13:03:22
回答 2查看 681关注 0票数 1

我有一张有一百多列的excel表格。我需要过滤其中的五个,以确定哪些列在其中一个单元格中有"no“。是否有一种方法可以使用单个搜索条件筛选多个列,如:

代码语言:javascript
复制
 no_invoice_filter = df[(df['M1: PL - INVOICED']) & (df['M2: EX - INVOICED']) & (df['M3: TEST DEP - INVOICED']) == 'No']

相反,如果每一列等于"no“,则分别写出。

以上代码出错:

代码语言:javascript
复制
TypeError: unsupported operand type(s) for &: 'str' and 'bool'
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-25 13:07:20

你可以:

代码语言:javascript
复制
df[(df[['M1: PL - INVOICED','M2: EX - INVOICED','M3: TEST DEP - INVOICED']] == 'No')]

因此,您实际上传递了一个感兴趣的cols列表,并将这些列与标量值进行比较,如果您在“No”之后出现在任何地方,那么使用any(axis=1)

代码语言:javascript
复制
In [115]:
df = pd.DataFrame({'a':'no', 'b':'yes', 'c':['yes','no','yes','no','no']})
df

Out[115]:
    a    b    c
0  no  yes  yes
1  no  yes   no
2  no  yes  yes
3  no  yes   no
4  no  yes   no

使用any(axis=1),它返回所有行,其中No出现在任何感兴趣的科尔中:

代码语言:javascript
复制
In [133]:    
df[(df[['a','c']] == 'no').any(axis=1)]

Out[133]:
    a    b    c
0  no  yes  yes
1  no  yes   no
2  no  yes  yes
3  no  yes   no
4  no  yes   no

还可以使用掩码删除特定列的NaN行,使用dropna。

代码语言:javascript
复制
In [132]:    
df[df[['a','c']] == 'no'].dropna(subset=['c'])

Out[132]:
    a    b   c
1  no  NaN  no
3  no  NaN  no
4  no  NaN  no
票数 1
EN

Stack Overflow用户

发布于 2016-10-25 13:05:47

对于列中的至少一个any,需要使用列的子集和No:

代码语言:javascript
复制
df[(df[['M1: PL - INVOICED','M2: EX - INVOICED','M3: TEST DEP - INVOICED']] == 'No')
      .any(axis=1)]

示例:

代码语言:javascript
复制
df = pd.DataFrame({'M1: PL - INVOICED':['a','Yes','No'],
                   'M2: EX - INVOICED':['Yes','No','b'],
                   'M3: TEST DEP - INVOICED':['s','a','No']})

print (df)
  M1: PL - INVOICED M2: EX - INVOICED M3: TEST DEP - INVOICED
0                 a               Yes                       s
1               Yes                No                       a
2                No                 b                      No

print ((df[['M1: PL - INVOICED','M2: EX - INVOICED','M3: TEST DEP - INVOICED']] == 'No'))
  M1: PL - INVOICED M2: EX - INVOICED M3: TEST DEP - INVOICED
0             False             False                   False
1             False              True                   False
2              True             False                    True

print ((df[['M1: PL - INVOICED','M2: EX - INVOICED','M3: TEST DEP - INVOICED']] == 'No')
          .any(axis=1))
0    False
1     True
2     True
dtype: bool


print (df[(df[['M1: PL - INVOICED','M2: EX - INVOICED','M3: TEST DEP - INVOICED']] == 'No')
           .any(1)])

  M1: PL - INVOICED M2: EX - INVOICED M3: TEST DEP - INVOICED
1               Yes                No                       a
2                No                 b                      No
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40240762

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档