使用Pandas根据两个不同列中的值计算行数

问题描述 投票:1回答:2

我有这个名为“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

有人会建议如何解决它或建议另一种方法吗?

python pandas count
2个回答
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行具有您要查找的值。从这里,您可以轻松收集所需的行。


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()”它完美无缺。

© www.soinside.com 2019 - 2024. All rights reserved.