Pandas: como usar uma função mutate() equivalente a r
Na linguagem de programação R, podemos usar a função mutate() do pacote dplyr para adicionar rapidamente novas colunas a um quadro de dados calculado a partir das colunas existentes.
Por exemplo, o código a seguir mostra como calcular o valor médio de uma coluna específica em R e adicionar esse valor como uma nova coluna em um quadro de dados:
library (dplyr) #create data frame df <- data. frame (team=c('A', 'A', 'A', 'A', 'B', 'B', 'B', 'B'), points=c(30, 22, 19, 14, 14, 11, 20, 28)) #add new column that shows mean points by team df <- df %>% group_by(team) %>% mutate(mean_points = mean(points)) #view updated data frame df team points mean_points 1 to 30 21.2 2 A 22 21.2 3 A 19 21.2 4 A 14 21.2 5 B 14 18.2 6 B 11 18.2 7 B 20 18.2 8 B 28 18.2
O equivalente à função mutate() em pandas é a função transform() .
O exemplo a seguir mostra como usar esta função na prática.
Exemplo: usando transform() em pandas para replicar mutate() em R
Suponha que temos o seguinte DataFrame do pandas que mostra os pontos marcados por jogadores de basquete de diferentes times:
import pandas as pd #createDataFrame df = pd. DataFrame ({' team ': ['A', 'A', 'A', 'A', 'B', 'B', 'B', 'B'], ' points ': [30, 22, 19, 14, 14, 11, 20, 28]}) #view DataFrame print (df) team points 0 to 30 1 to 22 2 to 19 3 to 14 4 B 14 5 B 11 6 B 20 7 B 28
Podemos usar a função transform() para adicionar uma nova coluna chamada Mean_points que mostra a média de pontos marcados por cada equipe:
#add new column to DataFrame that shows mean points by team df[' mean_points '] = df. groupby (' team ')[' points ']. transform (' mean ') #view updated DataFrame print (df) team points mean_points 0 to 30 21.25 1 to 22 21.25 2 A 19 21.25 3 to 14 21.25 4 B 14 18.25 5 B 11 18.25 6 B 20 18.25 7 B 28 18.25
O valor médio de pontos dos jogadores do Time A foi de 21,25 e o valor médio de pontos dos jogadores do Time B foi de 18,25 , portanto esses valores foram atribuídos de acordo a cada jogador em uma nova coluna.
Observe que isso corresponde aos resultados obtidos usando a função mutate() no exemplo introdutório.
É importante notar que você também pode usar lambda para realizar cálculos personalizados na função transform() .
Por exemplo, o código a seguir mostra como usar lambda para calcular a porcentagem do total de pontos marcados por cada jogador em seu respectivo time:
#create new column called percent_of_points
df[' percent_of_points '] = df. groupby (' team ')[' points ']. transform ( lambda x:x/ x.sum ())
#view updated DataFrame
print (df)
team points percent_of_points
0 A 30 0.352941
1 A 22 0.258824
2 A 19 0.223529
3 A 14 0.164706
4 B 14 0.191781
5 B 11 0.150685
6 B 20 0.273973
7 B 28 0.383562
Veja como interpretar o resultado:
- O primeiro jogador do Time A marcou 30 pontos de um total de 85 entre os jogadores do Time A. Assim, seu percentual no total de pontos marcados foi 30/85 = 0,352941 .
- O segundo jogador do Time A marcou 22 pontos de um total de 85 entre os jogadores do Time A. Assim, seu percentual no total de pontos marcados foi 22/85 = 0,258824 .
E assim por diante.
Observe que podemos usar o argumento lambda na função transform() para realizar qualquer cálculo personalizado que desejarmos.
Recursos adicionais
Os tutoriais a seguir explicam como realizar outras operações comuns em pandas:
Como realizar uma soma GroupBy no Pandas
Como usar Groupby e Plot no Pandas
Como contar valores únicos usando GroupBy no Pandas