[ad_1]
Deseja compartilhar seu conteúdo com R-blogueiros? clique aqui se você tiver um blog ou aqui se não tiver.
Nota: Esta é uma postagem antiga, originalmente escrita como um artigo do LinkedIn que escrevi no final Posso. Adicionei informações sobre como moldar dados graças a Casper Crause usando o data.table
biblioteca. Você pode ver nossa correspondência original nos comentários (por enquanto)
Se você se interessa por dados, sabe que um dos desafios que todos enfrentam ao trabalhar com dados é remodelar os dados para o formato que você deseja usá-los; felizmente, existem maneiras de moldar dados no Python e no R para acelerar o processo usando algumas das funções disponíveis em suas extensas bibliotecas.
Neste post, veremos como dinamizar dados de forma longa a ampla usando o Python pandas
biblioteca e R’s stats
, tidyr
e data.table
bibliotecas e como elas se combinam.
Escrevi mais anotações no código Python, pois ainda estou aprendendo sobre a linguagem e, embora tenha sido bastante fácil de entender, ainda preciso trabalhar nas etapas. Tenho certeza de que há outra maneira de organizar e modelar dados em Python, além de pandas
; Se você souber de outro, deixe um comentário abaixo e me avise!
Vamos lá!
O problema que usaremos será o que vi no site de ciência de dados do StackExchange. (link para o problema: aqui). Aqui estão as capturas de tela da pergunta.


Enquanto o OP só pede como fazer isso em R. Eu pensei que seria bom mostrar como isso funciona em Python também! Vamos mergulhar nele!
Contents
TL; DR: Para fazer a transformação acima, o uso da biblioteca de pandas do Python não é tão eficiente quanto o do R stats
, tidyr
ou data.table
bibliotecas.
Isenção de responsabilidade: para esse problema, vou me concentrar em obter os dados em sua forma correta. Não vou renomear colunas, pois é uma questão cosmética.
Pitão (Pandas
biblioteca):
Primeiro vamos inserir nossos dados:
# The Raw Data x = {"ID":[1234,1234], "APPROVAL_STEP":["STEP_A","STEP_B"], "APPROVAL_STATUS":["APPROVED","APPROVED"], "APPROVAL_DATE":["23-Jan-2019","21-Jan-2019"], "APPROVER":["John Smith","Jane Doe"]} print(x)
## {'ID': [1234, 1234], 'APPROVAL_STEP': ['STEP_A', 'STEP_B'], 'APPROVAL_STATUS': ['APPROVED', 'APPROVED'], 'APPROVAL_DATE': ['23-Jan-2019', '21-Jan-2019'], 'APPROVER': ['John Smith', 'Jane Doe']}
Agora, para converter esses dados em um quadro de dados usando o método DataFrame()
função do pandas
biblioteca.
import pandas as pd df=pd.DataFrame(x) df
## ID APPROVAL_STEP APPROVAL_STATUS APPROVAL_DATE APPROVER ## 0 1234 STEP_A APPROVED 23-Jan-2019 John Smith ## 1 1234 STEP_B APPROVED 21-Jan-2019 Jane Doe
Agora, para converter os dados em formato amplo; isso pode ser feito usando o .pivot_table()
método. Queremos indexar os dados com base em ID
e veja cada ponto de dados com base na etapa. Isso pode ser feito com o código abaixo:
df=df.pivot_table(index="ID", columns="APPROVAL_STEP", aggfunc="first") df
## APPROVAL_DATE APPROVAL_STATUS ## APPROVAL_STEP STEP_A STEP_B STEP_A STEP_B ## ID ## 1234 23-Jan-2019 21-Jan-2019 APPROVED APPROVED ## ## APPROVER ## APPROVAL_STEP STEP_A STEP_B ## ID ## 1234 John Smith Jane Doe
Estamos começando a ter nossos dados parecidos com o que queremos. Agora, para categorizar as colunas.
df.columns = ['_'.join(col) for col in df.columns] df
## APPROVAL_DATE_STEP_A APPROVAL_DATE_STEP_B APPROVAL_STATUS_STEP_A ## ID ## 1234 23-Jan-2019 21-Jan-2019 APPROVED ## ## APPROVAL_STATUS_STEP_B APPROVER_STEP_A APPROVER_STEP_B ## ID ## 1234 APPROVED John Smith Jane Doe
Agora, para os retoques finais, usamos o .reset_index()
método e reordene as colunas.
## ID APPROVAL_DATE_STEP_A APPROVAL_DATE_STEP_B APPROVAL_STATUS_STEP_A ## 0 1234 23-Jan-2019 21-Jan-2019 APPROVED ## ## APPROVAL_STATUS_STEP_B APPROVER_STEP_A APPROVER_STEP_B ## 0 APPROVED John Smith Jane Doe
## Error in py_call_impl(callable, dots$args, dots$keywords): KeyError: "['ID'] not in index" ## ## Detailed traceback: ## File "", line 2, in ## File "C:UsersSmithAppDataLocalr-minicondaenvsr-reticulatelibsite-packagespandascoreframe.py", line 2806, in __getitem__ ## indexer = self.loc._get_listlike_indexer(key, axis=1, raise_missing=True)[1] ## File "C:UsersSmithAppDataLocalr-minicondaenvsr-reticulatelibsite-packagespandascoreindexing.py", line 1553, in _get_listlike_indexer ## keyarr, indexer, o._get_axis_number(axis), raise_missing=raise_missing ## File "C:UsersSmithAppDataLocalr-minicondaenvsr-reticulatelibsite-packagespandascoreindexing.py", line 1646, in _validate_read_indexer ## raise KeyError(f"{not_found} not in index")
## APPROVAL_DATE_STEP_A APPROVAL_DATE_STEP_B APPROVAL_STATUS_STEP_A ## ID ## 1234 23-Jan-2019 21-Jan-2019 APPROVED ## ## APPROVAL_STATUS_STEP_B APPROVER_STEP_A APPROVER_STEP_B ## ID ## 1234 APPROVED John Smith Jane Doe
Ufa! Isso foi um monte de etapas a seguir para chegar aqui! Vamos ver como R combina!
R (tidyr
pacote)
o tidyr
library é um pacote feito por Hadley Wickam e sua equipe no RStudio. É um dos muitos pacotes no tidyverse feitos para gerenciar dados. Podemos resolver esse problema usando o pivot_wider()
função.
# The Raw Data x% pivot_wider(id_cols=ID, names_from=APPROVAL_STEP, values_from =c(APPROVAL_STATUS,APPROVAL_DATE,APPROVER)) t
## # A tibble: 1 x 7 ## ID APPROVAL_STATUS_STEP_A APPROVAL_STATUS_STEP~ APPROVAL_DATE_STEP~ APPROVAL_DATE_STEP~ APPROVER_STEP_A APPROVER_STEP_B #### 1 1234 APPROVED APPROVED 23-Jan-2019 21-Jan-2019 John Smith Jane Doe
Agora, só precisamos reordenar as colunas.
# Reordered t## # A tibble: 1 x 7 ## ID APPROVAL_STATUS_STEP_A APPROVAL_DATE_STEP~ APPROVER_STEP_A APPROVAL_STATUS_STEP~ APPROVAL_DATE_STEP~ APPROVER_STEP_B #### 1 1234 APPROVED 23-Jan-2019 John Smith APPROVED 21-Jan-2019 Jane Doe R (
stats
pacote)Usando o
reshape()
A função do pacote de estatísticas do R é uma maneira mais "antiga" de fazer isso, porque é algo mais popular entre as pessoas que aprenderam a escrever a era pré-arrumação do R. Sendo que eu aprendi R inicialmente com pessoas que programaram pré-arrumado, eu aprendi como fazer isso. Tudo isso pode ser feito com uma função sem precisar reordenar as colunas!(Isso também pode ser visto na minha resposta a esta pergunta na página Data Science StackExchange)
library(stats) reshape(x, timevar="APPROVAL_STEP", idvar="ID", sep="_", direction = "wide")## ID APPROVAL_STATUS_STEP_A APPROVAL_DATE_STEP_A APPROVER_STEP_A APPROVAL_STATUS_STEP_B APPROVAL_DATE_STEP_B ## 1 1234 APPROVED 23-Jan-2019 John Smith APPROVED 21-Jan-2019 ## APPROVER_STEP_B ## 1 Jane DoeAí está! Tudo com uma função!
R (
data.table
pacote)Casper Crause apontou que esta tarefa também pode ser realizada com o
data.table
pacote.A vantagem de usar isso
tidyr
ou ostats
pacotes é que data.table é escrito principalmente em C (veja detalhamento nos idiomas usados na página do Github vinculada). Portanto, para conjuntos de dados maiores, usar isso em um script economizará mais tempo computacionalmente.A peculiaridade aqui é que seu quadro de dados precisa ser convertido em uma tabela de dados (o que para este exemplo não foi nada difícil). Mas jogando isso em
dcast()
funciona como um encanto e coloca a formatação dos dados em termos "matemáticos", onde as variáveis de ID (linhas) são colocadas no lado esquerdo e as variáveis de medição são colocadas no lado direito.Obrigado Casper por apontar isso!
library(data.table) x## ID APPROVAL_STATUS_STEP_A APPROVAL_STATUS_STEP_B APPROVAL_DATE_STEP_A APPROVAL_DATE_STEP_B APPROVER_STEP_A ## 1: 1234 APPROVED APPROVED 23-Jan-2019 21-Jan-2019 John Smith ## APPROVER_STEP_B ## 1: Jane DoeEmbora existam maneiras de dinamizar dados de forma longa a ampla, tanto em Python quanto em R, o uso de R proporciona um tempo menos trabalhoso e intuitivo para modelar dados em oposição ao Python. Estou aprendendo que os dois idiomas têm seus pontos fortes, mas, para esse desafio de disputa de dados, R economiza tempo trabalhando com esse tipo de detalhes.
Se você escreve em R ou Python e tem uma solução alternativa / melhor para responder a esse problema (ou vê um erro), não hesite em falar comigo em um comentário ou mensagem para compartilhá-lo comigo!
Relacionado
[ad_2]