Atskleiskite Pandas GroupBy galią duomenų analizei. Vadovas pristato agregavimo ir transformavimo technikas su pavyzdžiais tarptautiniams duomenims.
Įvaldykite Pandas GroupBy operacijas: Agregavimas prieš transformavimą
Pandas, duomenų manipuliavimo pagrindas Python kalboje, siūlo galingą įrankį duomenims analizuoti ir suprasti: GroupBy operaciją. Ši funkcija leidžia suskirstyti duomenis į grupes pagal bendras charakteristikas ir tada pritaikyti funkcijas šioms grupėms, atskleidžiant įžvalgas, kurios kitu atveju liktų paslėptos. Šis straipsnis giliai nagrinėja dvi pagrindines GroupBy operacijas: agregavimą ir transformavimą, pateikdamas praktinius pavyzdžius ir paaiškinimus, tinkančius duomenų profesionalams visame pasaulyje.
GroupBy koncepcijos supratimas
Iš esmės, GroupBy yra procesas, apimantis tris pagrindinius žingsnius: duomenų padalijimą į grupes pagal vieną ar daugiau kriterijų, funkcijos taikymą kiekvienai grupei nepriklausomai ir rezultatų sujungimą į naują duomenų struktūrą. Ši „padalinti-taikyti-sujungti“ strategija yra pagrindinė duomenų analizės koncepcija ir suteikia lanksčią sistemą sudėtingiems duomenų rinkiniams tirti.
GroupBy galia slypi jo gebėjime apdoroti įvairius duomenų tipus ir struktūras, todėl jis pritaikomas įvairiose srityse. Nesvarbu, ar analizuojate pardavimų duomenis iš kelių regionų, jutiklių rodmenis iš skirtingų įrenginių, ar socialinės žiniasklaidos aktyvumą pagal demografinius rodiklius, GroupBy gali padėti jums išgauti prasmingų įžvalgų.
Agregavimas: duomenų apibendrinimas grupėse
Agregavimas – tai apibendrinamųjų statistikų apskaičiavimo procesas kiekvienai grupei. Šios statistikos pateikia glaustą grupės charakteristikų apžvalgą, leidžiančią palyginti ir supriešinti skirtingus jūsų duomenų segmentus. Dažniausiai naudojamos agregavimo funkcijos:
sum(): Apskaičiuoja reikšmių sumą kiekvienoje grupėje.mean(): Apskaičiuoja vidutinę reikšmę kiekvienoje grupėje.median(): Apskaičiuoja vidurinę reikšmę kiekvienoje grupėje.min(): Randa minimalią reikšmę kiekvienoje grupėje.max(): Randa maksimalią reikšmę kiekvienoje grupėje.count(): Skaičiuoja ne tuščių reikšmių skaičių kiekvienoje grupėje.size(): Grąžina kiekvienos grupės dydį (įskaitant tuščias reikšmes).std(): Apskaičiuoja standartinį nuokrypį kiekvienoje grupėje.var(): Apskaičiuoja dispersiją kiekvienoje grupėje.
Praktiniai agregavimo pavyzdžiai
Panagrinėkime hipotetinės e-komercijos įmonės tarptautinių pardavimų duomenų rinkinį. Duomenyse yra informacija apie produkto kategoriją, pardavimo šalį ir pardavimo sumą.
\nimport pandas as pd\n\n# Sample data\ndata = {\n 'Category': ['Electronics', 'Clothing', 'Electronics', 'Clothing', 'Home Goods', 'Electronics', 'Clothing', 'Home Goods'],\n 'Country': ['USA', 'UK', 'Canada', 'USA', 'Germany', 'UK', 'Canada', 'Germany'],\n 'Sales': [100, 50, 75, 60, 80, 90, 45, 70]\n}\n\ndf = pd.DataFrame(data)\n\nprint(df)\n
Tai išves:
\n\n Category Country Sales\n0 Electronics USA 100\n1 Clothing UK 50\n2 Electronics Canada 75\n3 Clothing USA 60\n4 Home Goods Germany 80\n5 Electronics UK 90\n6 Clothing Canada 45\n7 Home Goods Germany 70\n\n
1 pavyzdys: Bendra pardavimų suma pagal kategoriją
Norėdami apskaičiuoti bendrą pardavimų sumą kiekvienai produkto kategorijai, galime naudoti groupby() metodą, o po to – sum() agregavimo funkciją.
\ncategory_sales = df.groupby('Category')['Sales'].sum()\nprint(category_sales)\n
Tai išves:
\n\nCategory\nClothing 155\nElectronics 265\nHome Goods 150\nName: Sales, dtype: int64\n\n
2 pavyzdys: Vidutiniai pardavimai pagal šalį
Panašiai, norėdami apskaičiuoti vidutinius pardavimus pagal šalį, galime naudoti mean() agregavimo funkciją.
\ncountry_sales = df.groupby('Country')['Sales'].mean()\nprint(country_sales)\n
Tai išves:
\n\nCountry\nCanada 60.0\nGermany 75.0\nUK 70.0\nUSA 80.0\nName: Sales, dtype: float64\n\n
3 pavyzdys: Kelių agregavimo funkcijų naudojimas
Pandas leidžia vienu metu pritaikyti kelias agregavimo funkcijas naudojant agg() metodą. Tai suteikia išsamią grupės charakteristikų apžvalgą.
\ncategory_summary = df.groupby('Category')['Sales'].agg(['sum', 'mean', 'median', 'count'])\nprint(category_summary)\n
Tai išves:
\n\n sum mean median count\nCategory \nClothing 155 51.666667 50.0 3\nElectronics 265 88.333333 90.0 3\nHome Goods 150 75.000000 75.0 2\n\n
4 pavyzdys: Pasirinktinės agregavimo funkcijos
Taip pat galite apibrėžti savo pasirinktines agregavimo funkcijas naudodami lambda išraiškas arba pavadintas funkcijas. Tai leidžia apskaičiuoti konkrečias statistikas, kurių nėra standartinėse agregavimo funkcijose.
\n# Custom function to calculate the range (max - min)\ndef custom_range(x):\n return x.max() - x.min()\n\ncategory_summary = df.groupby('Category')['Sales'].agg(['sum', 'mean', custom_range])\nprint(category_summary)\n
Tai išves:
\n\n sum mean custom_range\nCategory \nClothing 155 51.666667 15\nElectronics 265 88.333333 25\nHome Goods 150 75.000000 10\n\n
Transformavimas: duomenų modifikavimas grupėse
Transformavimas, priešingai, apima duomenų modifikavimą kiekvienoje grupėje, remiantis tam tikru skaičiavimu. Skirtingai nuo agregavimo, kuris grąžina apibendrintą reikšmę kiekvienai grupei, transformavimas grąžina reikšmę kiekvienai pradinių duomenų eilutei, tačiau reikšmė apskaičiuojama atsižvelgiant į grupę, kuriai ta eilutė priklauso. Transformavimo operacijos išlaiko pradinį „DataFrame“ indeksą ir formą.
Dažniausi transformavimo naudojimo atvejai apima:
- Duomenų standartizavimas kiekvienoje grupėje.
- Reitingo arba procentilio skaičiavimas kiekvienoje grupėje.
- Trūkstamų reikšmių pildymas pagal grupės statistiką.
Praktiniai transformavimo pavyzdžiai
Tęskime su mūsų tarptautiniais pardavimų duomenimis. Galime taikyti transformavimą, kad atliktume skaičiavimus, susijusius su pardavimų duomenimis kiekvienoje šalyje.
1 pavyzdys: Pardavimų duomenų standartizavimas kiekvienoje šalyje (Z-balas)
Duomenų standartizavimas apima reikšmių transformavimą, kad jų vidurkis būtų 0, o standartinis nuokrypis – 1. Tai naudinga lyginant duomenis įvairiose skalėse ir pasiskirstymuose. Tam pasiekti galime naudoti transform() metodą kartu su lambda išraiška.
\nfrom scipy.stats import zscore\n\ndf['Sales_Zscore'] = df.groupby('Country')['Sales'].transform(zscore)\nprint(df)\n
Tai išves:
\n\n Category Country Sales Sales_Zscore\n0 Electronics USA 100 1.000000\n1 Clothing UK 50 -1.000000\n2 Electronics Canada 75 1.000000\n3 Clothing USA 60 -1.000000\n4 Home Goods Germany 80 1.000000\n5 Electronics UK 90 1.000000\n6 Clothing Canada 45 -1.000000\n7 Home Goods Germany 70 -1.000000\n\n
Stulpelis Sales_Zscore dabar pateikia standartizuotas pardavimų reikšmes kiekvienai šaliai. Reikšmės, didesnės nei 0, yra didesnės už vidutinius tos šalies pardavimus, o reikšmės, mažesnės nei 0, yra mažesnės už vidurkį.
2 pavyzdys: Pardavimų reitingo apskaičiavimas kiekvienoje kategorijoje
Norėdami apskaičiuoti kiekvieno pardavimo reitingą jo kategorijoje, galime naudoti rank() metodą transform() funkcijoje.
\ndf['Sales_Rank'] = df.groupby('Category')['Sales'].transform(lambda x: x.rank(method='dense'))\nprint(df)\n
Tai išves:
\n\n Category Country Sales Sales_Zscore Sales_Rank\n0 Electronics USA 100 1.000000 3.0\n1 Clothing UK 50 -1.000000 2.0\n2 Electronics Canada 75 1.000000 1.0\n3 Clothing USA 60 -1.000000 3.0\n4 Home Goods Germany 80 1.000000 2.0\n5 Electronics UK 90 1.000000 2.0\n6 Clothing Canada 45 -1.000000 1.0\n7 Home Goods Germany 70 -1.000000 1.0\n\n
Stulpelis Sales_Rank rodo kiekvieno pardavimo reitingą atitinkamoje kategorijoje. Argumentas `method='dense'` užtikrina, kad nuoseklūs reitingai būtų priskiriami be tarpų.
3 pavyzdys: Trūkstamų reikšmių pildymas pagal grupės vidurkį
Įveskime keletą trūkstamų reikšmių pardavimų duomenyse ir tada užpildykime jas pagal vidutinius pardavimus kiekvienai šaliai.
\nimport numpy as np\n\n# Introduce missing values\ndf.loc[[0, 3], 'Sales'] = np.nan\n\nprint(df)\n\n# Fill missing values based on country mean\ndf['Sales_Filled'] = df['Sales'].fillna(df.groupby('Country')['Sales'].transform('mean'))\nprint(df)\n
Pradinis „DataFrame“ su trūkstamomis reikšmėmis atrodytų taip:
\n\n Category Country Sales Sales_Zscore Sales_Rank\n0 Electronics USA NaN 1.000000 3.0\n1 Clothing UK 50 -1.000000 2.0\n2 Electronics Canada 75 1.000000 1.0\n3 Clothing USA NaN -1.000000 3.0\n4 Home Goods Germany 80 1.000000 2.0\n5 Electronics UK 90 1.000000 2.0\n6 Clothing Canada 45 -1.000000 1.0\n7 Home Goods Germany 70 -1.000000 1.0\n\n
Ir užpildžius trūkstamas reikšmes:
\n\n Category Country Sales Sales_Zscore Sales_Rank Sales_Filled\n0 Electronics USA NaN 1.000000 3.0 NaN\n1 Clothing UK 50 -1.000000 2.0 50.0\n2 Electronics Canada 75 1.000000 1.0 75.0\n3 Clothing USA NaN -1.000000 3.0 NaN\n4 Home Goods Germany 80 1.000000 2.0 80.0\n5 Electronics UK 90 1.000000 2.0 90.0\n6 Clothing Canada 45 -1.000000 1.0 45.0\n7 Home Goods Germany 70 -1.000000 1.0 70.0\n\n
Svarbi pastaba: Kadangi nebuvo esamo vidurkio `USA` atveju, gautos `Sales_Filled` reikšmės yra `NaN`. Tokių kraštutinių atvejų tvarkymas yra labai svarbus patikimai duomenų analizei ir turėtų būti atsižvelgiama į jį diegiant.
Agregavimas prieš transformavimą: pagrindiniai skirtumai
Nors agregavimas ir transformavimas yra galingos GroupBy operacijos, jos tarnauja skirtingiems tikslams ir turi išskirtinių savybių:
- Išvesties forma: Agregavimas sumažina duomenų dydį, grąžindamas vieną reikšmę kiekvienai grupei. Transformavimas išlaiko pradinį duomenų dydį, grąžindamas transformuotą reikšmę kiekvienai eilutei.
- Tikslas: Agregavimas naudojamas duomenims apibendrinti ir įžvalgoms apie grupės charakteristikas gauti. Transformavimas naudojamas duomenims modifikuoti grupėse, dažnai standartizavimui ar normalizavimui.
- Grąžinama reikšmė: Agregavimas grąžina naują „DataFrame“ arba „Series“ su agreguotomis reikšmėmis. Transformavimas grąžina „Series“ su transformuotomis reikšmėmis, kurias vėliau galima pridėti kaip naują stulpelį prie pradinio „DataFrame“.
Pasirinkimas tarp agregavimo ir transformavimo priklauso nuo jūsų konkrečių analitinių tikslų. Jei jums reikia apibendrinti duomenis ir palyginti grupes, agregavimas yra tinkamas pasirinkimas. Jei jums reikia modifikuoti duomenis grupėse, išlaikant pradinę duomenų struktūrą, transformavimas yra geresnis variantas.
Pažangios GroupBy technikos
Be pagrindinio agregavimo ir transformavimo, Pandas GroupBy siūlo daugybę pažangių metodų, skirtų sudėtingesnei duomenų analizei.
Pasirinktinių funkcijų taikymas naudojant apply()
Metodas apply() suteikia didžiausią lankstumą, leidžiantis pritaikyti bet kokią pasirinktinę funkciją kiekvienai grupei. Ši funkcija gali atlikti bet kokią operaciją, įskaitant agregavimą, transformavimą ar net sudėtingesnius skaičiavimus.
\ndef custom_function(group):\n # Calculate the sum of sales for each category in a group, only if there is more than one row in the group\n if len(group) > 1:\n group['Sales_Sum'] = group['Sales'].sum()\n else:\n group['Sales_Sum'] = 0 # Or some other default value\n return group\n\ndf_applied = df.groupby('Country').apply(custom_function)\nprint(df_applied)\n
Šiame pavyzdyje apibrėžiame pasirinktinę funkciją, kuri apskaičiuoja pardavimų sumą kiekvienoje grupėje (šalyje). Metodas apply() pritaiko šią funkciją kiekvienai grupei, todėl sukuriama nauja stulpelis, kuriame yra tos grupės pardavimų suma.
Svarbi pastaba: Funkcija apply gali būti labiau skaičiavimo intensyvumo reikalaujanti nei kiti metodai. Optimizuokite savo kodą ir apsvarstykite alternatyvius įgyvendinimus dirbant su dideliais duomenų rinkiniais.
Grupavimas pagal kelis stulpelius
Galite grupuoti duomenis pagal kelis stulpelius, kad sukurtumėte detalesnius segmentus. Tai leidžia analizuoti duomenis, remiantis kelių charakteristikų sankirta.
\ncategory_country_sales = df.groupby(['Category', 'Country'])['Sales'].sum()\nprint(category_country_sales)\n
Tai sugrupuos duomenis pagal Category ir Country, leisdama apskaičiuoti bendrą pardavimų sumą kiekvienai kategorijai kiekvienoje šalyje. Tai suteikia detalesnį pardavimų našumo vaizdą įvairiuose regionuose ir produktų linijose.
Iteravimas per grupes
Sudėtingesnei analizei galite iteruoti per grupes naudodami for ciklą. Tai leidžia pasiekti kiekvieną grupę individualiai ir atlikti jai pasirinktines operacijas.
\nfor name, group in df.groupby('Category'):\n print(f"Category: {name}")\n print(group)\n
Tai iteruos per kiekvieną produkto kategoriją ir išspausdins atitinkamus duomenis. Tai gali būti naudinga atliekant pasirinktinę analizę arba generuojant ataskaitas kiekvienai kategorijai.
Geriausia GroupBy naudojimo praktika
Norėdami užtikrinti efektyvų ir veiksmingą GroupBy naudojimą, atsižvelkite į šias geriausias praktikas:
- Supraskite savo duomenis: Prieš taikydami
GroupBy, skirkite laiko savo duomenų supratimui ir atitinkamų grupavimo kriterijų bei agregavimo/transformavimo funkcijų nustatymui. - Pasirinkite tinkamą operaciją: Atidžiai apsvarstykite, ar agregavimas, ar transformavimas yra tinkamas pasirinkimas jūsų analitiniams tikslams.
- Optimizuokite našumą: Dideliems duomenų rinkiniams apsvarstykite kodo optimizavimą, naudodami vektorizuotas operacijas ir vengdami nereikalingų ciklų.
- Tvarkykite trūkstamas reikšmes: Atkreipkite dėmesį į trūkstamas reikšmes savo duomenyse ir tinkamai jas tvarkykite naudodami metodus, tokius kaip
fillna()arbadropna(). - Dokumentuokite savo kodą: Aiškiai dokumentuokite savo kodą, kad paaiškintumėte kiekvienos
GroupByoperacijos tikslą ir jūsų pasirinkimų motyvus.
Išvada
Pandas GroupBy yra galingas įrankis duomenų analizei, leidžiantis suskirstyti duomenis, pritaikyti funkcijas kiekvienai grupei ir išgauti vertingų įžvalgų. Įvaldę agregavimo ir transformavimo technikas, galite atskleisti visą savo duomenų potencialą ir giliau suprasti pagrindinius modelius bei tendencijas. Nesvarbu, ar analizuojate pardavimų duomenis, jutiklių rodmenis, ar socialinės žiniasklaidos aktyvumą, GroupBy gali padėti priimti duomenimis pagrįstus sprendimus ir pasiekti savo analitinius tikslus. Priimkite GroupBy galią ir pakelkite savo duomenų analizės įgūdžius į kitą lygį.
Šis vadovas pateikė išsamią Pandas GroupBy operacijų apžvalgą, daugiausia dėmesio skiriant agregavimui ir transformavimui. Naudodami šias technikas tarptautiniams duomenims, duomenų mokslininkai visame pasaulyje gali gauti esminių verslo įžvalgų iš įvairių duomenų rinkinių. Praktikuokitės, eksperimentuokite ir pritaikykite šias technikas savo specifiniams poreikiams, kad išnaudotumėte visą Pandas potencialą.