使用Pandas根据两个不同列中的值计算行数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Pandas根据两个不同列中的值计算行数相关的知识,希望对你有一定的参考价值。
我有这个名为“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,它应该是零...
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
有人会建议如何解决它或建议另一种方法吗?
干得好。我保持列名相同,但用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行具有您要查找的值。从这里,您可以轻松收集所需的行。
感谢@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()”它完美无缺。
以上是关于使用Pandas根据两个不同列中的值计算行数的主要内容,如果未能解决你的问题,请参考以下文章
根据其他列中的值在 python 3 (pandas) 数据框中创建新列
Python Pandas根据多个其他列中的条件替换一列中的值[重复]