Vilket språk ska man välja för att arbeta med data - R eller Python? Både! Migrera från pandor till tidyverse och data.table och tillbaka

Genom att söka efter R eller Python på Internet hittar du miljontals artiklar och kilometertal av diskussioner om vilken som är bättre, snabbare och bekvämare för att arbeta med data. Men tyvärr är alla dessa artiklar och tvister inte särskilt användbara.

Vilket språk ska man välja för att arbeta med data - R eller Python? Både! Migrera från pandor till tidyverse och data.table och tillbaka

Syftet med den här artikeln är att jämföra de grundläggande databehandlingsteknikerna i de mest populära paketen för båda språken. Och hjälp läsarna att snabbt bemästra något de inte kan ännu. För de som skriver i Python, ta reda på hur man gör samma sak i R, och vice versa.

Under artikeln kommer vi att analysera syntaxen för de mest populära paketen i R. Det här är paketen som ingår i biblioteket tidyverseoch även paketet data.table. Och jämför deras syntax med pandas, det mest populära dataanalyspaketet i Python.

Vi kommer att gå steg för steg genom hela vägen för dataanalys från att ladda den till att utföra analytiska fönsterfunktioner med Python och R.

Innehåll

Den här artikeln kan användas som ett cheat sheet om du har glömt hur man utför en databehandlingsoperation i ett av de paket som övervägs.

Vilket språk ska man välja för att arbeta med data - R eller Python? Både! Migrera från pandor till tidyverse och data.table och tillbaka

  1. Huvudsakliga syntaxskillnader mellan R och Python
    1.1. Åtkomst till paketfunktioner
    1.2. Uppdrag
    1.3. Indexering
    1.4. Metoder och OOP
    1.5. Rörledningar
    1.6. Data struktur
  2. Några ord om paketen vi kommer att använda
    2.1. tidyverse
    2.2. datatabell
    2.3. pandor
  3. Installerar paket
  4. Laddar data
  5. Skapar dataramar
  6. Välja de kolumner du behöver
  7. Filtrera rader
  8. Gruppering och aggregering
  9. Vertikal sammanslutning av tabeller (UNION)
  10. Horisontell sammanfogning av tabeller (JOIN)
  11. Grundläggande fönsterfunktioner och beräknade kolumner
  12. Överensstämmelsetabell mellan databehandlingsmetoder i R och Python
  13. Slutsats
  14. En kort undersökning om vilket paket du använder

Om du är intresserad av dataanalys kan du hitta min telegram и Youtube kanaler. Det mesta av innehållet är tillägnat R-språket.

Huvudsakliga syntaxskillnader mellan R och Python

För att göra det lättare för dig att byta från Python till R, eller vice versa, kommer jag att ge några huvudpunkter som du måste vara uppmärksam på.

Åtkomst till paketfunktioner

När ett paket väl har laddats in i R behöver du inte ange paketnamnet för att komma åt dess funktioner. I de flesta fall är detta inte vanligt i R, men det är acceptabelt. Du behöver inte importera ett paket alls om du behöver någon av dess funktioner i din kod, utan ring det helt enkelt genom att ange namnet på paketet och namnet på funktionen. Avgränsaren mellan paket- och funktionsnamn i R är ett dubbelt kolon. package_name::function_name().

I Python, tvärtom, anses det klassiskt att anropa funktionerna i ett paket genom att uttryckligen ange dess namn. När ett paket laddas ner får det vanligtvis ett förkortat namn, t.ex. pandas vanligtvis används en pseudonym pd. En paketfunktion nås via en punkt package_name.function_name().

Uppdrag

I R är det vanligt att använda en pil för att tilldela ett värde till ett objekt. obj_name <- value, även om ett enda likhetstecken är tillåtet, används det enda likhetstecknet i R främst för att skicka värden till funktionsargument.

I Python görs tilldelningen uteslutande med ett enda likhetstecken obj_name = value.

Indexering

Det finns också ganska betydande skillnader här. I R börjar indexeringen vid ett och inkluderar alla specificerade element i det resulterande intervallet,

I Python börjar indexeringen från noll och det valda intervallet inkluderar inte det sista elementet som anges i indexet. Så design x[i:j] i Python kommer inte att inkludera j-elementet.

Det finns också skillnader i negativ indexering, i R-notation x[-1] kommer att returnera alla element i vektorn utom det sista. I Python kommer en liknande notation endast att returnera det sista elementet.

Metoder och OOP

R implementerar OOP på sitt eget sätt, jag skrev om detta i artikeln "OOP på R-språket (del 1): S3-klasser". I allmänhet är R ett funktionellt språk, och allt i det är byggt på funktioner. Därför, till exempel för Excel-användare, gå till tydiverse det blir lättare än pandas. Även om detta kan vara min subjektiva åsikt.

Kort sagt, objekt i R har inga metoder (om vi pratar om S3-klasser, men det finns andra OOP-implementationer som är mycket mindre vanliga). Det finns bara generaliserade funktioner som bearbetar dem olika beroende på objektets klass.

Rörledningar

Kanske är detta namnet på pandas Det blir inte helt korrekt, men jag ska försöka förklara innebörden.

För att inte spara mellanberäkningar och inte producera onödiga föremål i arbetsmiljön kan man använda en slags pipeline. De där. skicka resultatet av en beräkning från en funktion till nästa, och spara inte mellanresultat.

Låt oss ta följande kodexempel, där vi lagrar mellanliggande beräkningar i separata objekt:

temp_object <- func1()
temp_object2 <- func2(temp_object )
obj <- func3(temp_object2 )

Vi utförde 3 operationer i följd, och resultatet av var och en sparades i ett separat objekt. Men i själva verket behöver vi inte dessa mellanobjekt.

Eller ännu värre, men mer bekant för Excel-användare.

obj  <- func3(func2(func1()))

I det här fallet sparade vi inte mellanliggande beräkningsresultat, men att läsa kod med kapslade funktioner är extremt obekvämt.

Vi kommer att titta på flera tillvägagångssätt för databehandling i R, och de utför liknande operationer på olika sätt.

Rörledningar i biblioteket tidyverse genomförs av operatören %>%.

obj <- func1() %>% 
            func2() %>%
            func3()

Därmed tar vi resultatet av arbetet func1() och skicka det som första argument till func2(), då skickar vi resultatet av denna beräkning som det första argumentet func3(). Och i slutändan skriver vi alla beräkningar som utförs i objektet obj <-.

Allt ovanstående illustreras bättre än ord av detta meme:
Vilket språk ska man välja för att arbeta med data - R eller Python? Både! Migrera från pandor till tidyverse och data.table och tillbaka

В data.table kedjor används på liknande sätt.

newDT <- DT[where, select|update|do, by][where, select|update|do, by][where, select|update|do, by]

I var och en av hakparenteserna kan du använda resultatet av föregående operation.

В pandas sådana operationer separeras med en punkt.

obj = df.fun1().fun2().fun3()

De där. vi tar vårt bord df och använda hennes metod fun1(), sedan tillämpar vi metoden på det erhållna resultatet fun2()efter fun3(). Det resulterande resultatet sparas i ett objekt obj .

Data struktur

Datastrukturer i R och Python liknar varandra, men har olika namn.

beskrivning
Namn i R
Namn i Python/pandas

Tabellstruktur
data.frame, data.table, tibble
DataFrame

Endimensionell värdelista
vektor
Serier i pandor eller lista i ren Python

Flernivåig icke-tabellstruktur
Lista
Ordbok (dikt)

Vi kommer att titta på några andra funktioner och skillnader i syntax nedan.

Några ord om paketen vi kommer att använda

Först ska jag berätta lite om paketen som du kommer att bli bekant med under den här artikeln.

tidyverse

Официальный сайт: tidyverse.org
Vilket språk ska man välja för att arbeta med data - R eller Python? Både! Migrera från pandor till tidyverse och data.table och tillbaka
Bibliotek tidyverse skriven av Hedley Wickham, senior forskare vid RStudio. tidyverse består av en imponerande uppsättning paket som förenklar databehandlingen, varav 5 ingår i topp 10 nedladdningar från CRAN-förvaret.

Kärnan i biblioteket består av följande paket: ggplot2, dplyr, tidyr, readr, purrr, tibble, stringr, forcats. Vart och ett av dessa paket syftar till att lösa ett specifikt problem. Till exempel dplyr skapad för datamanipulation, tidyr för att få data till en snygg form, stringr förenklar arbetet med strängar, och ggplot2 är ett av de mest populära verktygen för datavisualisering.

fördel tidyverse är enkelheten och lättläst syntax, som på många sätt liknar SQL-frågespråket.

datatabell

Vilket språk ska man välja för att arbeta med data - R eller Python? Både! Migrera från pandor till tidyverse och data.table och tillbakaОфициальный сайт: r-datatable.com

Av författaren data.table är Matt Dole från H2O.ai.

Den första utgivningen av biblioteket ägde rum 2006.

Paketsyntaxen är inte lika bekväm som i tidyverse och påminner mer om klassiska dataramar i R, men samtidigt betydligt utökad i funktionalitet.

Alla manipulationer med tabellen i detta paket beskrivs inom hakparenteser, och om du översätter syntaxen data.table i SQL får du något sånt här: data.table[ WHERE, SELECT, GROUP BY ]

Styrkan med detta paket är snabbheten för att bearbeta stora mängder data.

pandor

Официальный сайт: pandas.pydata.org Vilket språk ska man välja för att arbeta med data - R eller Python? Både! Migrera från pandor till tidyverse och data.table och tillbaka

Namnet på biblioteket kommer från den ekonometriska termen "paneldata", som används för att beskriva flerdimensionella strukturerade uppsättningar av information.

Av författaren pandas är amerikanen Wes McKinney.

När det gäller dataanalys i Python, lika pandas Nej. Ett mycket multifunktionellt paket på hög nivå som låter dig utföra alla manipulationer med data, från att ladda data från alla källor till att visualisera det.

Installerar ytterligare paket

Paketen som diskuteras i den här artikeln ingår inte i de grundläggande R- och Python-distributionerna. Även om det finns en liten varning, om du installerade Anaconda-distributionen, installera ytterligare pandas inte nödvändig.

Installera paket i R

Om du har öppnat RStudios utvecklingsmiljö minst en gång vet du förmodligen redan hur du installerar det nödvändiga paketet i R. För att installera paket, använd standardkommandot install.packages() genom att köra den direkt i R själv.

# установка пакетов
install.packages("vroom")
install.packages("readr")
install.packages("dplyr")
install.packages("data.table")

Efter installationen måste paketen anslutas, vilket i de flesta fall kommandot används för library().

# подключение или импорт пакетов в рабочее окружение
library(vroom)
library(readr)
library(dplyr)
library(data.table)

Installera paket i Python

Så, om du har ren Python installerat, då pandas du måste installera den manuellt. Öppna en kommandorad, eller terminal, beroende på ditt operativsystem och ange följande kommando.

pip install pandas

Sedan går vi tillbaka till Python och importerar det installerade paketet med kommandot import.

import pandas as pd

Laddar data

Data mining är ett av de viktigaste stegen i dataanalys. Både Python och R, om så önskas, ger dig omfattande möjligheter att få data från alla källor: lokala filer, filer från Internet, webbplatser, alla typer av databaser.

Vilket språk ska man välja för att arbeta med data - R eller Python? Både! Migrera från pandor till tidyverse och data.table och tillbaka

Under hela artikeln kommer vi att använda flera datamängder:

  1. Två nedladdningar från Google Analytics.
  2. Titanic Passenger Dataset.

All data finns på min GitHub i form av csv- och tsv-filer. Var ska vi begära dem ifrån?

Laddar data till R: tidyverse, vroom, readr

För att ladda data till ett bibliotek tidyverse Det finns två paket: vroom, readr. vroom modernare, men i framtiden kan paketen komma att kombineras.

Citat från officiell dokumentation vroom.

vroom vs läsare
Vad innebär utgivningen av vroom menar för readr? För nu planerar vi att låta de två paketen utvecklas separat, men troligen kommer vi att förena paketen i framtiden. En nackdel med vrooms lata läsning är att vissa dataproblem inte kan rapporteras i förväg, så hur man bäst förenar dem kräver lite eftertanke.

vroom vs readr
Vad betyder release? vroom för readr? För närvarande planerar vi att utveckla båda paketen separat, men vi kommer förmodligen att kombinera dem i framtiden. En av nackdelarna med lat läsning vroom är att vissa problem med datan inte kan rapporteras i förväg, så du måste fundera på hur du bäst kan kombinera dem.

I den här artikeln kommer vi att titta på båda dataladdningspaketen:

Laddar data till R: vroom-paketet

# install.packages("vroom")
library(vroom)

# Чтение данных
## vroom
ga_nov  <- vroom("https://raw.githubusercontent.com/selesnow/publications/master/data_example/r_python_data/ga_nowember.csv")
ga_dec  <- vroom("https://raw.githubusercontent.com/selesnow/publications/master/data_example/r_python_data/ga_december.csv")
titanic <- vroom("https://raw.githubusercontent.com/selesnow/publications/master/data_example/r_python_data/titanic.csv")

Laddar data till R: readr

# install.packages("readr")
library(readr)

# Чтение данных
## readr
ga_nov  <- read_tsv("https://raw.githubusercontent.com/selesnow/publications/master/data_example/r_python_data/ga_nowember.csv")
ga_dec  <- read_tsv("https://raw.githubusercontent.com/selesnow/publications/master/data_example/r_python_data/ga_december.csv")
titanic <- read_csv("https://raw.githubusercontent.com/selesnow/publications/master/data_example/r_python_data/titanic.csv")

I paketet vroom, oavsett csv/tsv-dataformat, utförs laddningen av funktionen med samma namn vroom(), i paketet readr vi använder olika funktioner för varje format read_tsv() и read_csv().

Laddar data till R: data.table

В data.table det finns en funktion för att ladda data fread().

Laddar data till R: data.table-paketet

# install.packages("data.table")
library(data.table)

## data.table
ga_nov  <- fread("https://raw.githubusercontent.com/selesnow/publications/master/data_example/r_python_data/ga_nowember.csv")
ga_dec  <- fread("https://raw.githubusercontent.com/selesnow/publications/master/data_example/r_python_data/ga_december.csv")
titanic <- fread("https://raw.githubusercontent.com/selesnow/publications/master/data_example/r_python_data/titanic.csv")

Laddar data i Python: pandor

Om vi ​​jämför med R-paket, så är syntaxen i det här fallet närmast pandas kommer readr, därför att pandas kan begära data var som helst, och det finns en hel familj av funktioner i detta paket read_*().

  • read_csv()
  • read_excel()
  • read_sql()
  • read_json()
  • read_html()

Och många andra funktioner utformade för att läsa data från olika format. Men för våra syften räcker det read_table() eller read_csv() använder argument september för att ange kolumnavgränsaren.

Laddar data i Python: pandor

import pandas as pd

ga_nov  = pd.read_csv("https://raw.githubusercontent.com/selesnow/publications/master/data_example/russian_text_in_r/ga_nowember.csv", sep = "t")
ga_dec  = pd.read_csv("https://raw.githubusercontent.com/selesnow/publications/master/data_example/russian_text_in_r/ga_december.csv", sep = "t")
titanic = pd.read_csv("https://raw.githubusercontent.com/selesnow/publications/master/data_example/russian_text_in_r/titanic.csv")

Skapar dataramar

Tabell titanic, som vi laddade, det finns ett fält Sex, som lagrar passagerarens könsbeteckning.

Men för en mer bekväm presentation av data i termer av passagerarkön bör du använda namnet snarare än könskoden.

För att göra detta kommer vi att skapa en liten katalog, en tabell där det bara kommer att finnas 2 kolumner (kod och könsnamn) respektive 2 rader.

Skapa en dataram i R: tidyverse, dplyr

I kodexemplet nedan skapar vi den önskade dataramen med funktionen tibble() .

Skapa en dataram i R: dplyr

## dplyr
### создаём справочник
gender <- tibble(id = c(1, 2),
                 gender = c("female", "male"))

Skapa en dataram i R: data.table

Skapa en dataram i R: data.table

## data.table
### создаём справочник
gender <- data.table(id = c(1, 2),
                    gender = c("female", "male"))

Skapa en dataram i Python: pandas

В pandas Skapandet av ramar utförs i flera steg, först skapar vi en ordbok och sedan konverterar vi ordboken till en dataram.

Skapa en dataram i Python: pandas

# создаём дата фрейм
gender_dict = {'id': [1, 2],
               'gender': ["female", "male"]}
# преобразуем словарь в датафрейм
gender = pd.DataFrame.from_dict(gender_dict)

Välja kolumner

Tabellerna du arbetar med kan innehålla dussintals eller till och med hundratals kolumner med data. Men för att utföra analys behöver du som regel inte alla kolumner som finns tillgängliga i källtabellen.

Vilket språk ska man välja för att arbeta med data - R eller Python? Både! Migrera från pandor till tidyverse och data.table och tillbaka

Därför är en av de första operationerna som du kommer att utföra med källtabellen att rensa den från onödig information och frigöra minnet som denna information upptar.

Välja kolumner i R: tidyverse, dplyr

syntax dplyr är mycket likt SQL-frågespråket, om du är bekant med det kommer du snabbt att bemästra detta paket.

Använd funktionen för att välja kolumner select().

Nedan finns exempel på kod som du kan välja kolumner med på följande sätt:

  • Lista namnen på de obligatoriska kolumnerna
  • Se kolumnnamn med reguljära uttryck
  • Efter datatyp eller någon annan egenskap hos data som finns i kolumnen

Välja kolumner i R: dplyr

# Выбор нужных столбцов
## dplyr
### выбрать по названию столбцов
select(ga_nov, date, source, sessions)
### исключь по названию столбцов
select(ga_nov, -medium, -bounces)
### выбрать по регулярному выражению, стобцы имена которых заканчиваются на s
select(ga_nov, matches("s$"))
### выбрать по условию, выбираем только целочисленные столбцы
select_if(ga_nov, is.integer)

Välja kolumner i R: data.table

Samma operationer i data.table utförs något annorlunda, i början av artikeln gav jag en beskrivning av vilka argument som finns inom hakparenteser data.table.

DT[i,j,by]

Var:
i - var, d.v.s. filtrering efter rader
j - välj|uppdatera|do, dvs. välja kolumner och konvertera dem
efter - datagruppering

Välja kolumner i R: data.table

## data.table
### выбрать по названию столбцов
ga_nov[ , .(date, source, sessions) ]
### исключь по названию столбцов
ga_nov[ , .SD, .SDcols = ! names(ga_nov) %like% "medium|bounces" ]
### выбрать по регулярному выражению
ga_nov[, .SD, .SDcols = patterns("s$")]

Variabel .SD låter dig komma åt alla kolumner och .SDcols filtrera de obligatoriska kolumnerna med hjälp av reguljära uttryck eller andra funktioner för att filtrera namnen på de kolumner du behöver.

Välja kolumner i Python, pandor

För att välja kolumner efter namn i pandas det räcker med att tillhandahålla en lista över deras namn. Och för att välja eller utesluta kolumner efter namn med hjälp av reguljära uttryck måste du använda funktionerna drop() и filter(), och argument axel = 1, med vilken du anger att det är nödvändigt att bearbeta kolumner snarare än rader.

För att välja ett fält efter datatyp, använd funktionen select_dtypes(), och till argument innefattar eller utesluta skicka en lista med datatyper som motsvarar vilka fält du behöver välja.

Välja kolumner i Python: pandor

# Выбор полей по названию
ga_nov[['date', 'source', 'sessions']]
# Исключить по названию
ga_nov.drop(['medium', 'bounces'], axis=1)
# Выбрать по регулярному выражению
ga_nov.filter(regex="s$", axis=1)
# Выбрать числовые поля
ga_nov.select_dtypes(include=['number'])
# Выбрать текстовые поля
ga_nov.select_dtypes(include=['object'])

Filtrera rader

Källtabellen kan till exempel innehålla flera års data, men du behöver bara analysera den senaste månaden. Återigen kommer extra linjer att sakta ner databehandlingsprocessen och täppa till PC-minnet.

Vilket språk ska man välja för att arbeta med data - R eller Python? Både! Migrera från pandor till tidyverse och data.table och tillbaka

Filtrera rader i R: tydyverse, dplyr

В dplyr funktionen används för att filtrera rader filter(). Det tar en dataram som första argument, sedan listar du filtreringsvillkoren.

När du skriver logiska uttryck för att filtrera en tabell, i det här fallet, ange kolumnnamnen utan citattecken och utan att deklarera tabellnamnet.

När du använder flera logiska uttryck för att filtrera, använd följande operatorer:

  • & eller komma - logisk OCH
  • | - logiskt ELLER

Filtrera rader i R: dplyr

# фильтрация строк
## dplyr
### фильтрация строк по одному условию
filter(ga_nov, source == "google")
### фильтр по двум условиям соединённым логическим и
filter(ga_nov, source == "google" & sessions >= 10)
### фильтр по двум условиям соединённым логическим или
filter(ga_nov, source == "google" | sessions >= 10)

Filtrera rader i R: data.table

Som jag redan skrivit ovan, in data.table datakonverteringssyntaxen omges av hakparenteser.

DT[i,j,by]

Var:
i - var, d.v.s. filtrering efter rader
j - välj|uppdatera|do, dvs. välja kolumner och konvertera dem
efter - datagruppering

Argumentet används för att filtrera rader i, som har den första positionen inom hakparenteser.

Kolumner nås i logiska uttryck utan citattecken och utan att ange tabellnamnet.

Logiska uttryck är relaterade till varandra på samma sätt som i dplyr genom operatörerna & och |.

Filtrera rader i R: data.table

## data.table
### фильтрация строк по одному условию
ga_nov[source == "google"]
### фильтр по двум условиям соединённым логическим и
ga_nov[source == "google" & sessions >= 10]
### фильтр по двум условиям соединённым логическим или
ga_nov[source == "google" | sessions >= 10]

Filtrera strängar i Python: pandor

Filtrera efter rader i pandas liknar att filtrera in data.table, och görs inom hakparenteser.

I det här fallet utförs åtkomst till kolumner nödvändigtvis genom att ange namnet på dataramen; då kan kolumnnamnet också anges inom citattecken inom hakparenteser (exempel df['col_name']), eller utan citat efter perioden (exempel df.col_name).

Om du behöver filtrera en dataram efter flera villkor måste varje villkor placeras inom parentes. Logiska förhållanden är kopplade till varandra av operatörer & и |.

Filtrera strängar i Python: pandor

# Фильтрация строк таблицы
### фильтрация строк по одному условию
ga_nov[ ga_nov['source'] == "google" ]
### фильтр по двум условиям соединённым логическим и
ga_nov[(ga_nov['source'] == "google") & (ga_nov['sessions'] >= 10)]
### фильтр по двум условиям соединённым логическим или
ga_nov[(ga_nov['source'] == "google") | (ga_nov['sessions'] >= 10)]

Gruppering och aggregering av data

En av de mest använda operationerna inom dataanalys är gruppering och aggregering.

Vilket språk ska man välja för att arbeta med data - R eller Python? Både! Migrera från pandor till tidyverse och data.table och tillbaka

Syntaxen för att utföra dessa operationer är spridd över alla paket vi granskar.

I det här fallet tar vi en dataram som exempel titanic, och beräkna antalet och den genomsnittliga kostnaden för biljetter beroende på kabinklass.

Gruppering och aggregering av data i R: tidyverse, dplyr

В dplyr funktionen används för gruppering group_by()och för aggregering summarise(). Faktiskt, dplyr det finns en hel familj av funktioner summarise_*(), men syftet med den här artikeln är att jämföra den grundläggande syntaxen, så vi går inte in i en sådan djungel.

Grundläggande aggregeringsfunktioner:

  • sum() — summering
  • min() / max() – lägsta och högsta värde
  • mean() - genomsnitt
  • median() — median
  • length() - kvantitet

Gruppering och aggregering i R: dplyr

## dplyr
### группировка и агрегация строк
group_by(titanic, Pclass) %>%
  summarise(passangers = length(PassengerId),
            avg_price  = mean(Fare))

I funktion group_by() vi passerade tabellen som första argument titanic, och angav sedan fältet Pklass, som vi kommer att gruppera vårt bord efter. Resultatet av denna operation med operatören %>% skickas som det första argumentet till funktionen summarise()och lade till ytterligare 2 fält: passagerare и avg_price. I det första använder du funktionen length() beräknat antalet biljetter, och i den andra med hjälp av funktionen mean() fick det genomsnittliga biljettpriset.

Gruppering och aggregering av data i R: data.table

В data.table argumentet används för aggregering j som har en andra position inom hakparenteser och för gruppering by eller keyby, som har den tredje positionen.

Listan över aggregeringsfunktioner i detta fall är identisk med den som beskrivs i dplyr, därför att dessa är funktioner från den grundläggande R-syntaxen.

Gruppering och aggregering i R: data.table

## data.table
### фильтрация строк по одному условию
titanic[, .(passangers = length(PassengerId),
            avg_price  = mean(Fare)),
        by = Pclass]

Gruppering och aggregering av data i Python: pandor

Gruppera in pandas Liknande dplyr, men aggregeringen liknar inte dplyr inte alls data.table.

För att gruppera, använd metoden groupby(), där du måste skicka en lista med kolumner som dataramen kommer att grupperas efter.

För aggregering kan du använda metoden agg()som accepterar en ordbok. Ordboksnycklarna är kolumnerna där du kommer att tillämpa aggregeringsfunktionerna, och värdena är namnen på aggregeringsfunktionerna.

Aggregationsfunktioner:

  • sum() — summering
  • min() / max() – lägsta och högsta värde
  • mean() - genomsnitt
  • median() — median
  • count() - kvantitet

Funktion reset_index() i exemplet nedan används det för att återställa kapslade index som pandas standard till efter dataaggregation.

symbol låter dig gå till nästa rad.

Gruppering och aggregering i Python: pandor

# группировка и агрегация данных
titanic.groupby(["Pclass"]).
    agg({'PassengerId': 'count', 'Fare': 'mean'}).
        reset_index()

Vertikal sammanfogning av tabeller

En operation där du sammanfogar två eller flera tabeller med samma struktur. Datan vi laddade innehåller tabeller ga_nov и ga_dec. Dessa tabeller är identiska till sin struktur, dvs. har samma kolumner och datatyperna i dessa kolumner.

Vilket språk ska man välja för att arbeta med data - R eller Python? Både! Migrera från pandor till tidyverse och data.table och tillbaka

Detta är en uppladdning från Google Analytics för november och december, i det här avsnittet kommer vi att kombinera denna data i en tabell.

Vertikalt sammanfogande tabeller i R: tidyverse, dplyr

В dplyr Du kan kombinera 2 tabeller till en med funktionen bind_rows(), passerar tabeller som sina argument.

Filtrera rader i R: dplyr

# Вертикальное объединение таблиц
## dplyr
bind_rows(ga_nov, ga_dec)

Vertikalt sammanfoga tabeller i R: data.table

Det är inte heller något komplicerat, låt oss använda det rbind().

Filtrera rader i R: data.table

## data.table
rbind(ga_nov, ga_dec)

Vertikalt sammanfogande tabeller i Python: pandor

В pandas funktionen används för att sammanfoga tabeller concat(), där du måste skicka en lista med ramar för att kombinera dem.

Filtrera strängar i Python: pandor

# вертикальное объединение таблиц
pd.concat([ga_nov, ga_dec])

Horisontell sammanfogning av tabeller

En operation där kolumner från den andra läggs till i den första tabellen med nyckel. Det används ofta när man berikar en faktatabell (till exempel en tabell med försäljningsdata) med vissa referensdata (till exempel kostnaden för en produkt).

Vilket språk ska man välja för att arbeta med data - R eller Python? Både! Migrera från pandor till tidyverse och data.table och tillbaka

Det finns flera typer av sammanfogningar:

Vilket språk ska man välja för att arbeta med data - R eller Python? Både! Migrera från pandor till tidyverse och data.table och tillbaka

I den tidigare laddade tabellen titanic vi har en kolumn Sex, som motsvarar passagerarens könskod:

1 - hona
2 - hane

Vi har också skapat en tabell - en referensbok kön. För en mer bekväm presentation av data om passagerarnas kön måste vi lägga till namnet på könet från katalogen kön till bordet titanic.

Horisontell bordsfog i R: tidyverse, dplyr

В dplyr Det finns en hel familj av funktioner för horisontell sammanfogning:

  • inner_join()
  • left_join()
  • right_join()
  • full_join()
  • semi_join()
  • nest_join()
  • anti_join()

Det vanligaste i min praktik är left_join().

Som de två första argumenten tar funktionerna som anges ovan två tabeller för att sammanfoga, och som det tredje argumentet by du måste ange vilka kolumner som ska gå med.

Horisontell tabell sammanfogning i R: dplyr

# объединяем таблицы
left_join(titanic, gender,
          by = c("Sex" = "id"))

Horisontell sammanfogning av tabeller i R: data.table

В data.table Du måste ansluta till tabeller med nyckel med funktionen merge().

Argument för att merge() fungerar i data.table

  • x, y — Tabeller för sammanfogning
  • by — Kolumn som är nyckeln att gå med om den har samma namn i båda tabellerna
  • by.x, by.y — Namnen på de kolumner som ska slås samman, om de har olika namn i tabellerna
  • all, all.x, all.y — Join-typ, all returnerar alla rader från båda tabellerna, all.x motsvarar operationen LEFT JOIN (kommer att lämna alla rader i den första tabellen), all.y — motsvarar RIGHT JOIN operation (kommer att lämna alla rader i den andra tabellen ).

Horisontell sammanfogning av tabeller i R: data.table

# объединяем таблицы
merge(titanic, gender, by.x = "Sex", by.y = "id", all.x = T)

Horisontell bordskoppling i Python: pandor

Liksom i data.tableI pandas funktionen används för att sammanfoga tabeller merge().

Argument för merge()-funktionen i pandor

  • hur — Anslutningstyp: vänster, höger, yttre, inre
  • on — Kolumn som är en nyckel om den har samma namn i båda tabellerna
  • left_on, right_on — Namn på nyckelkolumner, om de har olika namn i tabeller

Horisontell bordskoppling i Python: pandor

# объединяем по ключу
titanic.merge(gender, how = "left", left_on = "Sex", right_on = "id")

Grundläggande fönsterfunktioner och beräknade kolumner

Fönsterfunktioner liknar i betydelsen aggregeringsfunktioner och används också ofta i dataanalys. Men till skillnad från aggregeringsfunktioner ändrar inte fönsterfunktioner antalet rader i den utgående dataramen.

Vilket språk ska man välja för att arbeta med data - R eller Python? Både! Migrera från pandor till tidyverse och data.table och tillbaka

Med hjälp av fönsterfunktionen delar vi i huvudsak upp den inkommande dataramen i delar enligt något kriterium, dvs. med värdet av ett fält eller flera fält. Och vi utför aritmetiska operationer på varje fönster. Resultatet av dessa operationer kommer att returneras på varje rad, d.v.s. utan att ändra det totala antalet rader i tabellen.

Låt oss till exempel ta bordet titanic. Vi kan beräkna hur stor procent kostnaden för varje biljett var inom sin hyttklass.

För att göra detta måste vi på varje rad få in den totala kostnaden för en biljett för den aktuella kabinklass som biljetten på denna linje tillhör, sedan dividera kostnaden för varje biljett med den totala kostnaden för alla biljetter i samma kabinklass .

Fönsterfunktioner i R: tidyverse, dplyr

För att lägga till nya kolumner, utan att använda radgruppering, in dplyr tjänar funktion mutate().

Du kan lösa problemet som beskrivs ovan genom att gruppera data efter fält Pklass och summera fältet i en ny kolumn göra. Dela sedan upp tabellen och dela upp fältvärdena göra till vad som hände i föregående steg.

Fönsterfunktioner i R: dplyr

group_by(titanic, Pclass) %>%
  mutate(Pclass_cost = sum(Fare)) %>%
  ungroup() %>%
  mutate(ticket_fare_rate = Fare / Pclass_cost)

Fönsterfunktioner i R: data.table

Lösningsalgoritmen förblir densamma som i dplyr, måste vi dela upp tabellen i fönster efter fält Pklass. Mata in beloppet för gruppen som motsvarar varje rad i en ny kolumn och lägg till en kolumn där vi beräknar andelen av kostnaden för varje biljett i sin grupp.

För att lägga till nya kolumner data.table operatör närvarande :=. Nedan är ett exempel på att lösa ett problem med hjälp av paketet data.table

Fönsterfunktioner i R: data.table

titanic[,c("Pclass_cost","ticket_fare_rate") := .(sum(Fare), Fare / Pclass_cost), 
        by = Pclass]

Fönsterfunktioner i Python: pandor

Ett sätt att lägga till en ny kolumn till pandas - använd funktionen assign(). För att sammanfatta kostnaden för biljetter per stugklass, utan att gruppera rader, kommer vi att använda funktionen transform().

Nedan är ett exempel på en lösning där vi lägger till i tabellen titanic samma 2 kolumner.

Fönsterfunktioner i Python: pandor

titanic.assign(Pclass_cost      =  titanic.groupby('Pclass').Fare.transform(sum),
               ticket_fare_rate = lambda x: x['Fare'] / x['Pclass_cost'])

Överensstämmelsetabell för funktioner och metoder

Nedan finns en överensstämmelsetabell mellan metoder för att utföra olika operationer med data i de paket vi har övervägt.

beskrivning
tidyverse
datatabell
pandor

Laddar data
vroom()/ readr::read_csv() / readr::read_tsv()
fread()
read_csv()

Skapar dataramar
tibble()
data.table()
dict() + from_dict()

Välja kolumner
select()
argument j, andra position inom hakparenteser
vi skickar listan över obligatoriska kolumner inom hakparenteser / drop() / filter() / select_dtypes()

Filtrera rader
filter()
argument i, första positionen inom hakparenteser
Vi listar filtreringsvillkoren inom hakparenteser / filter()

Gruppering och aggregering
group_by() + summarise()
argument j + by
groupby() + agg()

Vertikal sammanslutning av tabeller (UNION)
bind_rows()
rbind()
concat()

Horisontell sammanfogning av tabeller (JOIN)
left_join() / *_join()
merge()
merge()

Grundläggande fönsterfunktioner och lägga till beräknade kolumner
group_by() + mutate()
argument j använda operatören := + argument by
transform() + assign()

Slutsats

Kanske beskrev jag i artikeln inte de mest optimala implementeringarna av databehandling, så jag blir glad om du korrigerar mina misstag i kommentarerna, eller helt enkelt kompletterar informationen som ges i artikeln med andra tekniker för att arbeta med data i R / Python.

Som jag skrev ovan var syftet med artikeln inte att påtvinga en åsikt om vilket språk som är bättre, utan att förenkla möjligheten att lära sig båda språken, eller, om nödvändigt, migrera mellan dem.

Om du gillade artikeln kommer jag att bli glad över att ha nya prenumeranter på min Youtube и telegram kanaler.

Interview

Vilka av följande paket använder du i ditt arbete?

I kommentarerna kan du skriva anledningen till ditt val.

Endast registrerade användare kan delta i undersökningen. Logga in, Snälla du.

Vilket databehandlingspaket använder du (du kan välja flera alternativ)

  • 45,2%snyggt 19

  • 33,3%data.tabell14

  • 54,8%pandor 23

42 användare röstade. 9 användare avstod från att rösta.

Källa: will.com

Lägg en kommentar