我有一张有一百多列的excel表格。我需要过滤其中的五个,以确定哪些列在其中一个单元格中有"no“。是否有一种方法可以使用单个搜索条件筛选多个列,如:
no_invoice_filter = df[(df['M1: PL - INVOICED']) & (df['M2: EX - INVOICED']) & (df['M3: TEST DEP - INVOICED']) == 'No']相反,如果每一列等于"no“,则分别写出。
以上代码出错:
TypeError: unsupported operand type(s) for &: 'str' and 'bool'发布于 2016-10-25 13:07:20
你可以:
df[(df[['M1: PL - INVOICED','M2: EX - INVOICED','M3: TEST DEP - INVOICED']] == 'No')]因此,您实际上传递了一个感兴趣的cols列表,并将这些列与标量值进行比较,如果您在“No”之后出现在任何地方,那么使用any(axis=1)
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出现在任何感兴趣的科尔中:
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。
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发布于 2016-10-25 13:05:47
对于列中的至少一个any,需要使用列的子集和No:
df[(df[['M1: PL - INVOICED','M2: EX - INVOICED','M3: TEST DEP - INVOICED']] == 'No')
.any(axis=1)]示例:
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 Nohttps://stackoverflow.com/questions/40240762
复制相似问题