В 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