Pandas Den sveitsiske hærkniven for dine data, del 2

Dette er del to av en todelt opplæring om Pandas, den fantastiske Python data analytics toolkit. 

I første del dekket vi de grunnleggende datatyper av Pandas: serien og datarammen. Vi importerte og eksporterte data, valgte delsett av data, arbeidet med metadata, og sorterte dataene. 

I denne delen fortsetter vi vår reise og håndterer manglende data, data manipulering, dataflyting, datagruppering, tidsserier og plotting.

Å håndtere manglende verdier

En av de sterkeste punktene i pandas er håndtering av manglende verdier. Det vil ikke bare krasje og brenne i nærvær av manglende data. Når data mangler, erstatter pandas det med numpy's np.nan (ikke et tall), og det deltar ikke i noen beregning.

La oss reindexere datastammen, legge til flere rader og kolonner, men uten nye data. For å gjøre det interessant, fyller vi noen verdier.

>>> df = pd.DataFrame (np.random.randn (5,2), indeks = indeks, kolonner = ['a', 'b']) >>> new_index = df.index.append (pd.Index (['six'])) >>> new_columns = list (df.columns) + ['c'] >>> df = df.reindex (index = new_index, kolonner = new_columns) >>> df.loc [' c = 4 >>> df abc en -0,042172 0,374922 NaN to -0,689523 1,411403 NaN tre 0,332707 0,307561 3,0 fire 0,46519 -0,425181 4,0 fem -0,161095 - 0,849932 NaN seks NaN NaN NaN 

Noter det df.index.append () returnerer a ny indeks og endrer ikke den eksisterende indeksen. Også, df.reindex () returnerer a ny dataramme som jeg tilordner tilbake til df variabel.

På dette tidspunktet har vår dataramme seks rader. Den siste raden er alle NaNs, og alle andre rader unntatt den tredje og den fjerde har NaN i "c" kolonnen. Hva kan du gjøre med manglende data? Her er alternativer:

  • Hold det (men det vil ikke delta i beregninger).
  • Slett det (resultatet av beregningen vil ikke inneholde de manglende dataene).
  • Bytt den ut med en standardverdi.
Behold de manglende dataene --------------------- >>> df * = 2 >>> df abc one -0.084345 0.749845 NaN two -1.379046 2.822806 NaN three 0.665414 0.615123 6,0 fire 0,853037 -0,850362 8,0 fem -0,3222190 -1,699864 NaN seks NaN NaN NaN Fallrader med manglende data --------------------------- >> > df.dropna () abc tre 0,665414 0,615123 6,0 fire 0,853037 -0,850362 8,0 Erstatt med standardverdien -------------------------- >>> df .fillna (5) abc ett -0.084345 0.749845 5.0 to -1.379046 2.822806 5.0 tre 0.665414 0.615123 6.0 four 0.853037 -0.850362 8.0 five -0.322190 -1.699864 5.0 six 5.000000 5.000000 5.0 

Hvis du bare vil sjekke om du mangler data i datarammen, bruker du isnull () metode. Dette returnerer en boolsk mask av datapramen, som er ekte for manglende verdier og Falsk andre steder.

>>> df.isnull () en b c en Falsk False Sann to Falsk False Sann tre Falsk Falsk False Falsk Falsk False Fem Falsk False Sann seks True True True

Manipulere dataene dine

Når du har en dataramme, må du ofte utføre operasjoner på dataene. La oss starte med en ny dataramme som har fire rader og tre kolonner med tilfeldige heltall mellom 1 og 9 (inkluderende).

>>> df = pd.DataFrame (np.random.randint (1, 10, størrelse = (4, 3)), kolonner = ['a', 'b', 'c']) >>> df abc 0 1 3 3 1 8 9 2 2 8 1 5 3 4 6 1 

Nå kan du begynne å jobbe med dataene. La oss oppsummere alle kolonnene og tildele resultatet til siste rad, og sum deretter alle rader (dimensjon 1) og tilordne til siste kolonne:

>>> df.loc [3] = df.sum () >>> df abc 0 1 3 3 1 8 9 2 2 8 1 5 3 21 19 11 >>> df.c = df.sum (1)> >> df abc 0 1 3 7 1 8 9 19 2 8 1 14 3 21 19 51 

Du kan også utføre operasjoner på hele datarammen. Her er et eksempel på å trekke 3 fra hver celle:

>>> df - = 3 >>> df a b c 0 -2 0 4 1 5 6 16 2 5 -2 11 3 18 16 48 

For total kontroll kan du bruke vilkårlige funksjoner:

>>> df.apply (lambda x: x ** 2 + 5 * x - 4) a b c 0 -10 -4 32 1 46 62 332 2 46 -10 172 3 410 332 2540

Slå sammen data

Et annet vanlig scenario ved arbeid med datarammer kombinerer og slår sammen datarammer (og serier) sammen. Pandas, som vanlig, gir deg forskjellige alternativer. La oss lage en annen dataramme og utforske de ulike alternativene.

>>> df2 = df // 3 >>> df2 a b c 0 -1 0 1 1 1 2 5 2 1 -1 3 3 6 5 16

concat

Ved bruk av pd.concat sammenkobler pandas ganske enkelt alle rader av de angitte delene i rekkefølge. Det er ingen justering av indekser. Se i det følgende eksemplet hvordan dupliserte indeksverdier opprettes:

>>> pd.concat ([df, df2]) a b c 0 -2 0 4 1 5 6 16 2 5 -2 11 3 18 16 48 0 -1 0 1 1 1 2 5 2 1 -1 3 3 6 5 16 

Du kan også sammenkoble kolonner ved å bruke aksen = 1 argument:

>>> pd.concat ([df [: 2], df2], akse = 1) abcabc 0 -2,0 0,0 4,0 -1 0 1 1 5,0 6,0 16,0 1 2 5 2 NaN NaN NaN 1 -1 3 3 NaN NaN NaN 6 5 16 

Merk at fordi den første datarammen (jeg bare brukte to rader) ikke hadde så mange rader, ble de manglende verdiene automatisk befolket med NaNs, som endret disse kolonnetyper fra int til å flyte.

Det er mulig å sammenkoble et hvilket som helst antall datarammer i en samtale.

Slå sammen

Sammenslåingsfunksjonen oppfører seg på samme måte som SQL-tilkobling. Den fusjonerer alle kolonnene fra rader med lignende nøkler. Merk at den kun opererer på to datarammer:

>>> df = pd.DataFrame (dikt (nøkkel = ['start', 'finish'], x = [4, 8]) >>> df nøkkel x 0 start 4 1 finish 8 >>> df2 = pd .DataFrame (dikt (nøkkel = ['start', 'finish'], y = [2, 18]) >>> df2 nøkkel y 0 start 2 1 ferdig 18 >>> pd.merge (df, df2, på = "tast") tast xy 0 start 4 2 1 ferdig 8 18

Tilføy

Datarammen er føye () Metoden er en liten snarvei. Det oppfører seg funksjonelt som concat (), men sparer noen viktige streker.

>>> df nøkkel x 0 start 4 1 finish 8 Legg til en rad ved hjelp av append-metoden () ----------------------------- -------------- >>> df.append (dict (nøkkel = 'midten', x = 9), ignore_index = True) tasten x 0 start 4 1 ferdig 8 2 midten 9 Vedlegg en rad ved hjelp av concat () ------------------------------------------- >>> pd.concat ([df, pd.DataFrame (dict (nøkkel = 'middle', x = [9])], ignore_index = True) tast x 0 start 4 1 ferdig 8 2 midten 9

Gruppering av dataene dine

Her er en dataramme som inneholder medlemmer og alder av to familier: Smiths og Joneses. Du kan bruke gruppe av() metode for å gruppere data etter etternavn og finne informasjon på familienivå som summen av alder og middelalderen:

df = pd.DataFrame (dikt (første = 'John Jim Jenny Jill Jack'.split (), sist = "Smith Jones Jones Smith Smith" .split (), alder = [11, 13, 22, 44, 65]) ) >>> df.groupby ('siste'). sum () alder sist Jones 35 Smith 120 >>> df.groupby ('siste'). gjennomsnittlig () alder sist Jones 17.5 Smith 40.0 

Tidsserier

Mange viktige data er tidsseriedata. Pandas har sterk støtte for tidsseriedata som starter med dataområder, gjennom lokalisering og tidskonvertering, og helt til sofistikert frekvensbasert resampling.

De datointervall() funksjonen kan generere sekvenser av datatider. Her er et eksempel på å generere en seks ukes periode som begynner 1. januar 2017 ved hjelp av UTC-tidssonen.

>>> uker = pd.date_range (start = '1/1/2017', perioder = 6, freq = "W", tz = "UTC") >>> uker DatetimeIndex (['2017-01-01' '2017-01-08', '2017-01-15', '2017-01-22', '2017-01-29', '2017-02-05'], dtype = "datetime64 [UTC, UTC] ", freq =" W-SUN ")

Å legge til en tidsstempel i datarammer, enten som datakolonne eller som indeks, er flott for å organisere og gruppere dataene dine med tiden. Det tillater også resampling. Her er et eksempel på omsampling hvert minutt data som fem minutters aggregeringer.

>>> minutter = pd.date_range (start = '1/1/2017', perioder = 10, freq = "1Min", tz = "UTC") >>> ts = pd.Series (np.random.randn len (minutter)), minutter) >>> ts 2017-01-01 00: 00: 00 + 00: 00 1.866913 2017-01-01 00: 01: 00 + 00: 00 2.157201 2017-01-01 00:02 : 00 + 00: 00 -0.439932 2017-01-01 00: 03: 00 + 00: 00 0.777944 2017-01-01 00: 04: 00 + 00: 00 0.755624 2017-01-01 00: 05: 00 + 00 : 00 -2.150276 2017-01-01 00: 06: 00 + 00: 00 3.352880 2017-01-01 00: 07: 00 + 00: 00 -1.657432 2017-01-01 00: 08: 00 + 00: 00 - 0.144666 2017-01-01 00: 09.00 + 00: 00 -0.667059 Freq: T, dtype: float64 >>> ts.resample ('5Min'). Mean () 2017-01-01 00: 00: 00 + 00:00 1.023550 2017-01-01 00: 05: 00 + 00: 00 -0,253311

plotting

Pandas støtter plotting med matplotlib. Pass på at den er installert: pip installere matplotlib. For å generere et tomt, kan du ringe plott() av en serie eller en dataramme. Det er mange alternativer for å kontrollere plottet, men standardene fungerer for enkle visualiseringsformål. Slik genererer du en linjediagram og lagrer den i en PDF-fil.

ts = pd.Series (np.random.randn (1000), indeks = pd.date_range ('1/1/2017', perioder = 1000)) ts = ts.cumsum () ax = ts.plot () fig = ax.get_figure () fig.savefig ('plot.pdf')

Legg merke til at på macOS må Python installeres som et rammeverk for å plotte med Pandas.

Konklusjon

Pandas er et meget bredt dataanalyseramme. Den har en enkel objektmodell med konseptene serie og dataramme og et vell av innebygd funksjonalitet. Du kan komponere og blande pandasfunksjoner og dine egne algoritmer. 

I tillegg, ikke nøl med å se hva vi har tilgjengelig for salg og for studier på markedet, og ikke nøl med å stille spørsmål og gi din verdifulle tilbakemelding ved hjelp av feedet under.

Dataimport og eksport i pandaer er også svært omfattende og sikrer at du enkelt kan integrere det i eksisterende systemer. Hvis du gjør noen databehandling i Python, tilhører pandas i verktøykassen din.