我有这个名为“dem”的数据框:
code CBO SEXO \
47 58 NaN F
48 58 Ajudante de motorista F
49 58 Ajudante de motorista M
50 58 Ajudante de motorista M
51 58 Brasador NaN
52 58 Brasador M
53 58 Brasador M
FAIXA_IDADE ESCOLARIDADE
47 DE 21 A 30 ANOS Superior completo
48 MAIS DE 50 ANOS NaN
49 DE 21 A 30 ANOS Ginasial completo, ou Fundamental completo
50 DE 41 A 50 ANOS Colegial incompleto, ou Médio incompleto
51 DE 41 A 50 ANOS Colegial completo, ou Médio completo
52 DE 41 A 50 ANOS Colegial completo, ou Médio completo
53 DE 41 A 50 ANOS Ginasial completo, ou Fundamental completo
我想知道在CBO列中有多少行,ESCOLARIDADE列中的“motorista”或“Motorista”AND包含“Fundamental completo”字样。因此,结果应为1(CBO包含“motorista”的行有三行,但只有一行ESCOLARIDADE包含“Fundamental completo”)。
我试过了:
try:
mot_fund_comp=dem.loc[dem.CBO.str.contains('motorista|Motorista')].ESCOLARIDADE.str.contains['Fundamental completo'].count()
except:
mot_fund_comp=0
我总是0。
并
当我在下面的数据框中应用同一行时,它会给我带来结果1,当它应该是ZERO ...
dem:
code CBO SEXO \
89 59 Alimentador de linha de produção NaN
90 59 Alimentador de linha de produção M
91 59 Alimentador de linha de produção M
92 59 Alimentador de linha de produção M
93 59 Assistente de laboratório industrial F
94 59 Auxiliar de escritório M
95 59 Auxiliar de manutenção predial F
96 59 Balanceiro M
97 59 Comprador M
98 59 Desidratador de alimentos M
99 59 Desidratador de alimentos M
100 59 Desidratador de alimentos M
101 59 Desidratador de alimentos M
102 59 Mecânico de manutenção de máquinas, em geral M
103 59 Motorista de caminhão (rotas regionais e inter... M
104 59 Operador de filtro-prensa (tratamentos químico... M
105 59 Soldador M
106 59 Soldador M
107 59 Soldador M
FAIXA_IDADE ESCOLARIDADE
89 MAIS DE 50 ANOS Colegial completo, ou Médio completo
90 DE 21 A 30 ANOS NaN
91 DE 21 A 30 ANOS Colegial completo, ou Médio completo
92 DE 41 A 50 ANOS Ginasial incompleto, ou entre 4ª e 8ª série
93 DE 21 A 30 ANOS NaN
94 DE 21 A 30 ANOS Colegial completo, ou Médio completo
95 DE 41 A 50 ANOS Colegial completo, ou Médio completo
96 DE 21 A 30 ANOS Colegial completo, ou Médio completo
97 MAIS DE 50 ANOS Colegial completo, ou Médio completo
98 DE 21 A 30 ANOS Colegial completo, ou Médio completo
99 DE 31 A 40 ANOS Colegial completo, ou Médio completo
100 DE 31 A 40 ANOS Ginasial completo, ou Fundamental completo
101 MAIS DE 50 ANOS Colegial completo, ou Médio completo
102 DE 41 A 50 ANOS Colegial completo, ou Médio completo
103 DE 41 A 50 ANOS Colegial completo, ou Médio completo
104 DE 31 A 40 ANOS Colegial completo, ou Médio completo
105 DE 31 A 40 ANOS Colegial completo, ou Médio completo
106 DE 41 A 50 ANOS Colegial completo, ou Médio completo
107 MAIS DE 50 ANOS Colegial completo, ou Médio completo
有人会建议如何解决它或建议另一种方法吗?
答案 0 :(得分:3)
感谢@roganjosh给予灵感以找到答案。
我注意到当我使用" |"作为包含函数内部的OR运算符,有时它可以正常工作,有时它不会。如果我像在这里一样使用它:
df=dem.CBO.str.contains('motorista|Motorista').sum()
工作正常。 但是,为了解决上面的问题,我不得不调整它,而不是使用" |"在contains函数里面。我将代码更改为:
mot_fund_comp=dem.loc[dem.CBO.str.contains('motorista') | dem.CBO.str.contains('Motorista')].ESCOLARIDADE.str.contains['Fundamental completo'].sum()
另一个细节:出于某种原因,我无法跟踪,如果我使用" .count()",则值出错。如果我使用" .sum()"它运作得很好。
答案 1 :(得分:2)
你走了。我保持列名相同,但用yes,Motorista和yea取代了motorista,用yes_please取代了Fundamental completo。
import pandas as pd
import numpy as np
data = {'CBO': ['yes', 'no', 'yea', 'no', 'yes'], 'escolaridade':
['no', 'no', 'yes_please', 'yes_please', 'yes_please']}
df = pd.DataFrame(data, columns=['CBO', 'escolaridade'])
df['value'] = ((df['CBO'] == 'yes') | (df['CBO'] == 'yea')) &
(df['escolaridade'] == 'yes_please')
刚刚创建了一个新行,通过使用标记True来显示哪些行包含您想要的值。
然后:
df = df[df['value'] == True]
为您提供所需的所有行:
CBO escolaridade value
2 yea yes_please True
4 yes yes_please True
显示第2行和第4行具有您要查找的值。从这里,您可以轻松收集所需的行。