在Pandas中,如何从另一个数据帧的比例创建新的数据帧?

2024-04-29 19:29:37 发布

您现在位置:Python中文网/ 问答频道 /正文

在python3和pandas中,我有以下数据帧:

df_total.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 388950 entries, 0 to 12533
Data columns (total 22 columns):
 #   Column                                Non-Null Count   Dtype 
---  ------                                --------------   ----- 
 0   IdPedido                              388950 non-null  object
 1   ProtocoloPedido                       388950 non-null  object
 2   OrgaoDestinatario                     388950 non-null  object
 3   Situacao                              388950 non-null  object
 4   DataRegistro                          388950 non-null  object
 5   ResumoSolicitacao                     388950 non-null  object
 6   DetalhamentoSolicitacao               388950 non-null  object
 7   PrazoAtendimento                      388950 non-null  object
 8   FoiProrrogado                         388950 non-null  object
 9   FoiReencaminhado                      388950 non-null  object
 10  FormaResposta                         388950 non-null  object
 11  OrigemSolicitacao                     388950 non-null  object
 12  IdSolicitante                         388950 non-null  object
 13  CategoriaPedido                       388950 non-null  object
 14  SubCategoriaPedido                    388950 non-null  object
 15  NumeroPerguntas                       388950 non-null  object
 16  DataResposta                          388950 non-null  object
 17  Resposta                              388950 non-null  object
 18  TipoResposta                          388950 non-null  object
 19  ClassificacaoTipoResposta             388950 non-null  object
 20  OrgaoSuperiorAssociadoaoDestinatario  205394 non-null  object
 21  id_ano                                388950 non-null  object
dtypes: object(22)
memory usage: 68.3+ MB

这是一个关于巴西信息访问请求的数据框架。“OrgaoDestinatorio”列中有接收请求的机构的名称。“TipoResposta”列是对请求的响应类型

我数了两列

df_total['OrgaoDestinatario'].value_counts()
ME - Ministério da Economia                                                  42559
MS – Ministério da Saúde                                                     17196
ANEEL – Agência Nacional de Energia Elétrica                                 12996
INSS – Instituto Nacional do Seguro Social                                   11059
MAPA – Ministério da Agricultura, Pecuária e Abastecimento                   10215
                                                                             ...  
EBSERH - HUJB-UFCG - Hospital Universitário Júlio Maria Bandeira de Mello       38
EBSERH - HUAP-UFF - Hospital Universitário Antônio Pedro                        23
EBSERH - HUAC-UFCG - Hospital Universitário Alcides Carneiro                    17
EBSERH - HC-UFPE - Hospital das Clínicas de Pernambuco                          14
EBSERH - HC-UFU - Hospital de Clínicas de Uberlândia                             7
Name: OrgaoDestinatario, Length: 305, dtype: int64

df_total['TipoResposta'].value_counts()
Acesso Concedido                                            278712
Acesso Negado                                                25187
Não se trata de solicitação de informação                    23719
Acesso Parcialmente Concedido                                18365
Informação Inexistente                                       13794
Órgão não tem competência para responder sobre o assunto     13233
Pergunta Duplicada/Repetida                                   8677
Encaminhado para o e-Ouv                                      7263
Name: TipoResposta, dtype: int64

以及实体“TipoResposta”中的子计数。例如:

eco = df_total[(df_total['OrgaoDestinatario'] == 'ME - Ministério da Economia')]
eco['TipoResposta'].value_counts()
Acesso Concedido                                            22928
Não se trata de solicitação de informação                    7887
Acesso Negado                                                4070
Encaminhado para o e-Ouv                                     3115
Órgão não tem competência para responder sobre o assunto     1291
Pergunta Duplicada/Repetida                                  1134
Informação Inexistente                                       1124
Acesso Parcialmente Concedido                                1010
Name: TipoResposta, dtype: int64

我想创建一个新的数据框,其中有一列名为“实体列表”,每一行都包含“OrgaoDestinatorio”信息,而不重复它(在本例中为305行)。例如:

list_of_entities
ME - Ministério da Economia
CEF – Caixa Econômica Federal
MS – Ministério da Saúde
ANEEL – Agência Nacional de Energia Elétrica
INSS – Instituto Nacional do Seguro Social
BACEN – Banco Central do Brasil
MAPA – Ministério da Agricultura, Pecuária e Abastecimento
…

其他栏目的名称见“TipoResposta”:“Acesso Concedido”、“Não se trata de requestaão de informaão”、“Acesso Negado”

但这些列中的每一行都会有一个数学帐户的结果,一个相对于“实体列表”值的数字:各实体的“TipoResposta”类别之和除以该实体的总请求,乘以100。示例:

“经济部长”有42559项请求,在“Acesso Concedido”项下有22928项请求。所以它是22928/42559*100=53.87,所以在新的数据框中,在“经济部长”行和“Acesso Concedido”列中,会有53,87的值

其他“TipoResposta”列的账户类型相同。在下一行中,使用其他类型的“OrgaoDestinatorio”,在列中重复相同类型的帐户

请问,有人知道我如何使用Python来实现这一点吗

--/--

二月二十七日版

通过这些步骤,我能够生成包含所需信息的数据帧

# First I made a value_counts for the items of 'OrgaoDestinatario', saved it as a dataframe and renamed the columns
conta_orgao = df_total['OrgaoDestinatario'].value_counts().reset_index()
conta_orgao.rename(columns={"index": "nome_orgao"}, inplace=True)
conta_orgao.rename(columns={"OrgaoDestinatario": "conta_vez"}, inplace=True)
conta_orgao.reset_index().head()
index   nome_orgao  conta_vez
0   0   ME - Ministério da Economia     42559
1   1   MS – Ministério da Saúde    17196
2   2   ANEEL – Agência Nacional de Energia Elétrica    12996
3   3   INSS – Instituto Nacional do Seguro Social  11059
4   4   MAPA – Ministério da Agricultura, Pecuária e A...   10215

# Then a groupby with two columns ('OrgaoDestinatario','TipoResposta') and with size, and renamed the column with the count, and saved it as a dataframe
conta_tipo = df_total.groupby(['OrgaoDestinatario','TipoResposta']).size().reset_index()
conta_tipo.rename(columns={0: "conta_por_orgao"}, inplace=True)
conta_tipo.reset_index().head()
    index   OrgaoDestinatario   TipoResposta    conta_por_orgao
0   0   ABGF - Agencia Brasileira Gestora de Fundos Ga...   Acesso Concedido    153
1   1   ABGF - Agencia Brasileira Gestora de Fundos Ga...   Acesso Negado   25
2   2   ABGF - Agencia Brasileira Gestora de Fundos Ga...   Acesso Parcialmente Concedido   23
3   3   ABGF - Agencia Brasileira Gestora de Fundos Ga...   Informação Inexistente  40
4   4   ABGF - Agencia Brasileira Gestora de Fundos Ga...   Não se trata de solicitação de informação   143

# I made a copy of this dataframe with another name to group the final results afterwards
contagem_geral = conta_tipo.copy()


# This function reads all the lines of the copied dataframe above
# And create a new column
# First I load the name of each 'OrgaoDestinatario' in the variable "orgao"
# Then the size value of the groupby of 'OrgaoDestinatario' and 'TipoResposta' in the "conta_por_orgao" variable
# And then iterate on the other dataframe with the total number of items in each 'OrgaoDestinatario'
# And I load in a variable the 'OrgaoDestinatario' of this iteration and put it in "orgao_vez"
# And I load the value_counts of 'OrgaoDestinatario', in "total"
# If "orgao" and "orgao_vez" I count the proportion
# And I send this value to be placed in the new column that I had created on the dataframe copies
# And it continues on all lines

def limpeza(linha):
    orgao = linha["OrgaoDestinatario"]
    conta_por_orgao = linha["conta_por_orgao"]

    for num, row in conta_orgao.iterrows():
        orgao_vez = row['nome_orgao']
        total = row['conta_vez']

        if orgao == orgao_vez:
            valor = int(conta_por_orgao) / int(total) * 100
            valor = float(valor)
            return valor

contagem_geral["proporcao_em_relacao_ao_total_do_orgao"] = contagem_geral.apply(limpeza, axis=1)

contagem_geral.reset_index().head()
    index   OrgaoDestinatario   TipoResposta    conta_por_orgao     proporcao_em_relacao_ao_total_do_orgao
0   0   ABGF - Agencia Brasileira Gestora de Fundos Ga...   Acesso Concedido    153     28.544776
1   1   ABGF - Agencia Brasileira Gestora de Fundos Ga...   Acesso Negado   25  4.664179
2   2   ABGF - Agencia Brasileira Gestora de Fundos Ga...   Acesso Parcialmente Concedido   23  4.291045
3   3   ABGF - Agencia Brasileira Gestora de Fundos Ga...   Informação Inexistente  40  7.462687
4   4   ABGF - Agencia Brasileira Gestora de Fundos Ga...   Não se trata de solicitação de informação   143     26.679104

Tags: theobjectdenulldatotalnonrio