Гузариш ба мундариҷа
Мавзӯи 1 аз 7

Series — сутун бо тамғаҳо

Барои чӣ Series лозим аст

Ҳарорати ҳафта, шумораи меҳмонон аз рӯйи толорҳо ва баҳоҳо аз рӯйи фанҳо танҳо пайдарпайии ададҳо нестанд. Донистани он муҳим аст, ки ҳар қимат ба кадом рӯз, толор ё фан тааллуқ дорад. Дар рӯйхати одӣ ин робитаро алоҳида нигоҳ медорем; дар pandas он қисми худи додаҳо мешавад.

Series маҷмӯи якченакаи қиматҳо бо тамғаҳо аст. Тамғаҳо индекс месозанд ва қиматҳо одатан навъи ягона доранд. DataFrame чанд чунин сутунро ба ҷадвал муттаҳид мекунад. Аз як сутун оғоз мекунем: унсурҳоро интихоб мекунем, ҳисоб мекунем ва бе давраи дастӣ ҷамъбаст мегирем.

1. Сохтан: қиматҳо ва индекс

Китобхонаро одатан бо номи pd ворид мекунанд. Ба pd.Series қиматҳо ва ба index тамғаҳои ҳамон миқдорро медиҳанд. Тамғаҳои ин ҷо рамзҳои кӯтоҳи рӯзҳоянд: сатрҳои одӣ, на фармонҳои махсуси pandas.

import pandas as pd

temps = pd.Series([12, 16, 8], index=["Mon", "Tue", "Wed"])
print(temps)
print(temps.dtype)
print(pd.Series([4, 7]).index.tolist())

Натиҷа:

Mon    12
Tue    16
Wed     8
dtype: int64
int64
[0, 1]

Ҳангоми чоп тамғаҳо дар чап ва қиматҳо дар рост меоянд. dtype: int64 навъи ададҳои бутунро нишон медиҳад; он сатри иловагии додаҳо нест. Бе index pandas тамғаҳои 0, 1, ... месозад. Series-ро аз луғат ҳам сохтан мумкин аст: калидҳо индекс ва қиматҳо додаҳо мешаванд.

2. Тамға ва мавқеъ фарқ доранд

Мавқеъ рақами тартибии унсур аз сифр аст. Тамға қимати дар индекс буда мебошад. loc аз рӯйи тамға ва iloc аз рӯйи мавқеъ интихоб мекунад. Дар индекси худкор онҳо метавонанд мувофиқ оянд, аммо мафҳуми якхела нестанд. index.tolist() тамғаҳоро ҳамчун рӯйхати одӣ нишон медиҳад.

stock = pd.Series({10: 40, 20: 25})
print(stock.loc[20], stock.iloc[0])
print(stock.index.tolist())
print(stock.to_numpy().tolist())

Натиҷа:

25 40
[10, 20]
[40, 25]

3. Ҳисоб барои тамоми сутун

Ҳангоми ҷамъ кардани Series бо адад амал ба ҳар қимат татбиқ мешавад. Муқоиса ҳам унсур ба унсур иҷро шуда, маскаи булӣ месозад: Series аз True ва False. Агар онро ба қавсҳои мураббаъ диҳем, танҳо унсурҳои дорои True бо тамғаҳои аслиашон мемонанд. Ин амалҳо натиҷа медиҳанд, аммо temps-ро худкор аз нав наменависанд.

print((temps + 2).tolist())
print((temps >= 12).tolist())
print(temps[temps >= 12].to_dict())
print(temps.tolist())

Натиҷа:

[14, 18, 10]
[True, True, False]
{'Mon': 12, 'Tue': 16}
[12, 16, 8]

4. Як адад ба ҷойи сутун

Агрегат чанд қиматро ба як қимат табдил медиҳад: sum ҷамъ, mean миёна, min ва max ҳадҳоро медиҳанд. idxmax тамғаи қимати калонтаринро бармегардонад, на худи қиматро. Ҳангоми баробарӣ қимати аввали тартиби ҷорӣ интихоб мешавад. describe() нишондиҳандаҳои маъмули оморӣ, аз ҷумла квартилҳо — ҳадҳои чоряки додаҳои мураттабшударо ҷамъ мекунад.

print(temps.sum(), temps.mean())
print(temps.max(), temps.idxmax())
print(temps.describe().loc[["count", "min", "50%", "max"]].to_dict())

Натиҷа:

36 12.0
16 Tue
{'count': 3.0, 'min': 8.0, '50%': 12.0, 'max': 16.0}

5. Мувофиқкунӣ чӣ гуна кор мекунад

Pandas аввал ду Series-ро аз рӯйи индекс мувофиқ мекунад, мисли муқоисаи ду рӯйхат аз рӯйи насаб. Тартиби сабтҳо метавонад фарқ кунад: қиматҳои як тамға ҷамъ мешаванд. Дар ҳолати маъмули индексҳои такрорнашаванда натиҷа иттиҳоди тамғаҳоро дорад. Агар дар як тараф қимат набошад, натиҷаи он ҷуфт NaN, яъне қимати гумшуда мешавад. Сатри дуюми мисол натиҷаи тозашударо медиҳад; Series-ҳои аслӣ тағйир намеёбанд.

a = pd.Series([2, 5], index=["A", "B"])
b = pd.Series([7, 9], index=["B", "C"])
print((a + b).to_dict())
print((a + b).dropna().to_dict())
print(a.add(b, fill_value=0).to_dict())

Натиҷа:

{'A': nan, 'B': 12.0, 'C': nan}
{'B': 12.0}
{'A': 2.0, 'B': 12.0, 'C': 9.0}

Дар add параметри fill_value=0 сифрро пеш аз ҷамъ дар ҷойи як операнди гумшуда мегузорад. Аммо (a + b).fillna(0) натиҷаи аллакай гумшударо бо сифр иваз мекард: маънои дигар дорад. Аз сабаби NaN натиҷаи одии бутун метавонад float64 шавад; ин тағйири тарзи нигоҳдорӣ аст, на хатои арифметикӣ.

6. Басомад, тартиб ва даврзанӣ

value_counts() такрори қиматҳоро мешуморад ва одатан сертакрортаринҳоро аввал мегузорад. Бо normalize=True ҳиссаҳо ҳосил мешаванд. Басомад ва тартиби алифбо қоидаҳои ҷудоянд: агар барои баробарӣ қоидаи махсус лозим бошад, онро алоҳида диҳед. sort_values қиматҳо ва sort_index тамғаҳоро мураттаб мекунад. items() ҷуфтҳои «тамға, қимат»-ро медиҳад, ки барои чопи ҳисоботи хурд қулай аст.

colors = pd.Series(["red", "blue", "red", "red"])
print(colors.value_counts().to_dict())
print(colors.value_counts(normalize=True).to_dict())
print(temps.sort_values().index.tolist())
for day, value in temps.sort_index().items():
    print(day, value)

Натиҷа:

{'red': 3, 'blue': 1}
{'red': 0.75, 'blue': 0.25}
['Wed', 'Mon', 'Tue']
Mon 12
Tue 16
Wed 8

Хатоҳои маъмул ва ислоҳи онҳо

  1. Омехтани тамға ва мавқеъ. stock[0] тамғаи вуҷуднадоштаи 0-ро меҷӯяд ва KeyError медиҳад. Барои унсури аввал stock.iloc[0], барои тамғаи 10 бошад, stock.loc[10] нависед.
  2. Интизори ҷамъ аз рӯйи тартиб шудан. a + b унсурҳои аввалро худкор ҷуфт намекунад: ҷойҳои холӣ пайдо мешаванд. Аввал муайян кунед, ки кадом тамғаҳо бояд мувофиқ оянд; агар додаҳо воқеан мавқеӣ бошанд, массивҳои ҳамдарозии to_numpy()-ро ошкоро истифода баред.
  3. Нигоҳ надоштани натиҷа. temps.sort_values() тағйирёбандаро дигар намекунад. Ислоҳ: ordered = temps.sort_values() ва идомаи кор бо ordered.
  4. Интизор шудани қиматҳои гумшуда дар басомадҳо. s.value_counts() бо нобаёнӣ NaN-ро намешуморад. Агар ҷойи холӣ ҳам гурӯҳи ҳисобот бошад, s.value_counts(dropna=False) нависед.

Пеш аз ҳисоб воҳиди ченак ва маънои индексро санҷед. Ду Series-и ҳамдароз ҳатман як объектҳоро тавсиф намекунанд. Баробарии шумораи унсурҳо ҷойи санҷиши тамғаҳоро намегирад.

Ёддошт

Вазифа Навишт
Сохтани сутун pd.Series(values, index=labels)
Интихоби унсур s.loc[label], s.iloc[i]
Ҷамъбаст s.mean(), s.describe()
Тамғаи қимати калонтарин s.idxmax()
Шумориши такрорҳо s.value_counts()
Тағйири тартиб s.sort_values(), s.sort_index()
Даврзанӣ аз рӯйи ҷуфтҳо s.items()