В pandas как создать новый фрейм данных из пропорций другого? - PullRequest
0 голосов
/ 26 февраля 2020

В 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

Это фрейм данных по запросам на доступ к информации в Бразилии. В столбце «OrgaoDestinatario» указаны названия учреждений, которые получили запросы. И в столбце «ТипоРеспоста», который был типом ответа на запрос

, я сосчитал два столбца

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

, а также подсчет в «ТипоРеспосте» объекта. Пример:

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

Я хочу создать новый фрейм данных, в котором есть столбец с именем «list_of_entities», и каждая строка содержит информацию «OrgaoDestinatario», не повторяя ее (в данном случае 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
…

И другие столбцы с именами, найденными в «ТипоРеспоста»: «Acesso Concedido», «Não se trata de solicitação de informação», «Acesso Negado»…

Но строки в каждом из этих столбцов будут иметь результат математического счета, число, относительно значения «list_of_entities»: сумма категории «TipoResposta» соответствующего объекта, деленная на общее количество запросов этого объекта, умноженное на 100 Пример:

У «ME - Ministério da Economia» было 42 559 запросов, а по пункту «Acesso Concedido» - 22 928 случаев. Таким образом, это 22,928 / 42,559 * 100 = 53,87. Таким образом, в новом кадре данных в строке «ME - Ministério da Economia» и в столбце «Acesso Concedido» будет значение 53,87

и тот же тип счета для других столбцов "ТипоРеспоста". И в следующей строке, с другими типами «OrgaoDestinatario», повторите тот же тип учетной записи в столбцах

Пожалуйста, кто-нибудь знает, как я мог сделать это с Python?

--- / ---

27 февраля, издание

Благодаря этим шагам я смог сгенерировать фрейм данных с необходимой мне информацией

# 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...