Ca și în cazul ndarray NumPy, puteți aplica operatori aritmetici precum + și * la Series întregi la un moment dat, care nu este doar un cod ușor de scris, ci și rulează fulgerător. Dar Pandas Series este chiar mai inteligentă decât atât.
Figure 12.1: Două Series în memorie
Luați în considerare imaginea memoriei din Figura 12.1. Aici avem două Series, una indicată de o variabilă salaries și cealaltă de raises, care sunt de dimensiuni diferite și care au seturi de chei suprapuse, dar nu identice. Ce crezi că ar face Pandas dacă am executa acest cod?
new_salaries = salaries + raises
Răspunsul, din fericire, este cel mai inteligent lucru posibil pe care l-ar putea face. Pandas nu este nici confuz, nici înăbușit de faptul că cheile sunt în ordine diferită în cele două Series și, în schimb, face ceea ce îți dorești cu siguranță: adaugă elemente corespunzătoare, cu chei potrivite și produc o Series nouă cu toate aceste sume.
Rezultatul real în acest caz este în Figura 12.2, iar rezultatul este
new_salaries = salaries + raises prin t(new_salaries)
Figura 12.2: Rezultatul + a două Series care nu au toate aceleași chei.
▐ Dwight 71.5 ▐ Jim NaN ▐ Michael 129.5 ▐ Pam 69.0 ▐ Robert NaN ▐ Ryan NaN ▐ dtype: float64
Convinge-te că salariul de 68.000 de dolari al lui Dwight a fost adăugat la creșterea lui de 3.500 de dolari, că salariul de 113.000 de dolari al lui Michael a fost adăugat la creșterea de 16.500 de dolari etc.
Nu vă speriați încă de acele intrări NaN. Valoarea specială „NaN” înseamnă „nu un număr” și, practic, înseamnă că Pandas trebuie să ridice mâinile în acest caz. Și cu un motiv bun. Jim are un salariu curent de 100.200 USD în prima Series, dar nu are nicio valoare în a doua (nicio majorare pentru Jim anul acesta? Nu te-ai hotărât deocamdată care va fi mărirea lui? Altceva?) Deci Pandas face ce știe, ridică din umeri și spune „nu știu”. Spunem că intrarea Jim din Series new_salaries este o valoare lipsă. Același lucru este valabil și pentru Robert și Ryan, fiecare dintre aceștia fiind prezent doar în unul dintre cei doi operanzi.
Acum știu la ce te gândești: „Nu poate Pandas să presupună că salariul și/sau majorarea este 0 dacă lipsește unul?” Răspunsul este că da, se poate, dar nu va face acest lucru decât dacă dați aprobarea. Pandas este precaut aici și nu vrea să introducă erori în fluxul dvs. de date prin presupuneri false. (Poate că în compania dvs., de exemplu, există un salariu standard de intrare pe care îl primește fiecare angajat care nu este specificat în seria de salarii. Sau poate că mărirea anuală este întotdeauna presupusă a fi o creștere fixă de 2,5% a costului vieții, dacă nu este specificat în mod explicit.)
Dacă vrem ca Pandas să-și asume o anumită valoare implicită, trebuie să schimbăm puțin tactica și să mergem cu funcția add() (sau sub(), mul() sau div()):
new_salaries = pd.Series.add(salaries, raises, fill_value=0) print(new_salaries)
▐ Dwight 71.5 ▐ Jim 100.2 ▐ Michael 129.5 ▐ Pam 69.0 ▐ Robert 100.0 ▐ Ryan 68.0 ▐ dtype: float64
Argumentul fill_value este cel mai important aici: specifică ce valoare implicită să fie utilizată dacă uneia dintre adăugari îi lipsește o cheie de la celălalt. Acum rezultatul este ca în Figura 12.3. Puteți, desigur, să alegeți un fill_value, altul decât zero, dacă doriți.
Ca și în cazul matricelor NumPy, putem adăuga (sau scădea, sau înmulți, …) o singură valoare atomică la o serie, de asemenea:
cost_of_living_increase = salaries * .025 print(cost_of_living_increase)
Figura 12.3: Folosind add() în schimb și transmiterea unui fill_value.
▐ Michael 2.825 ▐ Dwight 1.700 ▐ Pam 1.675 ▐ Jim 2.505 ▐ Ryan 1.700 ▐ dtype: float64
salaries = salaries + cost_of_living_increase print(salaries)
▐ Michael 115.825 ▐ Dwight 69.700 ▐ Pam 68.675 ▐ Jim 102.705 ▐ Ryan 69.700 ▐ dtype: float64
Uneori poate fi util să facem și concatenarea șirurilor, de exemplu dacă am avut prenumele și numele angajaților în două serii cu ID-ul angajatului lor ca index:
firsts = pd.Series(['Hannibal', 'Clarice', 'Multiple', 'Buffalo'], index=[666, 1993, 47, 988]) lasts = pd.Series(['Starling', 'Crawford', 'Lecter', 'Bill', 'Miggs'], index=[1993, 1650, 666, 988, 47]) print(firsts + " " + lasts)
▐ 47 Multiple Miggs ▐ 666 Hannibal Lecter ▐ 988 Buffalo Bill ▐ 1650 NaN ▐ 1993 Clarice Starling ▐ dtype: object
Sursa: Stephen Davies, The Crystal Ball – Instruction Manual, Vol. 1: Introduction to Data Science, v. 1.1. Copyright © 2021 Stephen Davies. Licența CC BY-SA 4.0. Traducere și adaptare: Nicolae Sfetcu. © 2024 MultiMedia Publishing, Introducere în Știința Datelor, Volumul 1
Lasă un răspuns