Гурӯҳбандӣ
Барои чӣ гурӯҳбандӣ лозим аст
Дар дафтари таҷҳизот ҳар сатр як давраи кори дастгоҳро тавсиф мекунад. Ба роҳбари озмоишгоҳ нишондиҳандаҳои дигар лозиманд: соатҳои умумии кори ҳар дастгоҳ, шумораи давраҳо ва сарбории миёна. Дастгоҳҳоро алоҳида гирифта, сатрҳоро дастӣ ҷамъ кардан душвор аст, хусусан агар номҳояшон пешакӣ маълум набошанд.
Гурӯҳбандӣ сатрҳои дорои қимати якхелаи аломати интихобшударо муттаҳид мекунад. Ин аломат калиди гурӯҳ ном дорад. Баъд барои ҳар гурӯҳ ҷамъбаст ҳисоб мекунанд ё сабтҳои лозимро мегиранд. Ҷадвали аслӣ дафтари муфассал мемонад, натиҷа бошад, ҳисоботи кӯтоҳ мешавад. Аввал муайян кунед, ки гурӯҳ чист: дастгоҳ, ҳуҷра ё ҷуфти «дастгоҳ ва рӯз».
1. Ҷудо кардан, амал кардан, муттаҳид кардан
groupby("device") объекти гурӯҳбандӣ месозад: ин ҳанӯз ҷамъҳои тайёр нест. Интихоби ["hours"] сутуни ададиро ва sum() амалро муайян мекунад. Натиҷа Series аст, ки индекси он калидҳои гурӯҳҳоро дорад. Сатрҳои як гурӯҳ дар ҷадвали аслӣ ҳатман паҳлуи ҳам нестанд.
import pandas as pd
log = pd.DataFrame({
"device": ["B", "A", "B", "C", "A"],
"day": [1, 1, 2, 1, 2],
"hours": [2, 4, 6, 3, 2],
})
totals = log.groupby("device")["hours"].sum()
print(totals)
print(log.groupby("device")["hours"].mean().to_dict())
Натиҷа:
device
A 6
B 8
C 3
Name: hours, dtype: int64
{'A': 3.0, 'B': 4.0, 'C': 3.0}
2. Шумораи сатрҳо ва қиматҳои маълум
size() ҳамаи сатрҳои гурӯҳро мешуморад. count() танҳо қиматҳои гумнашудаи сутуни интихобшударо мешуморад. Агар ҷойи холӣ набошад, ҷавобҳо баробаранд, аммо саволҳо гуногунанд. Номаълум будани давомнокии кор маънои набудани худи давраи корро надорад. nunique() қиматҳои гуногуни маълумро мешуморад: ин нишондиҳандаи сеюм аст.
readings = pd.DataFrame({"room": ["X", "X", "Y"], "value": [5, None, 5]})
groups = readings.groupby("room")["value"]
print(groups.size().to_dict())
print(groups.count().to_dict())
print(log.groupby("device")["day"].nunique().to_dict())
Натиҷа:
{'X': 2, 'Y': 1}
{'X': 1, 'Y': 1}
{'A': 2, 'B': 2, 'C': 1}
3. Чанд нишондиҳанда бо agg
Агрегатсия қиматҳои гурӯҳро ба ҷамъбаст табдил медиҳад. agg чанд чунин амалро якбора муайян мекунад. Рӯйхати номҳои методҳо сутунҳои sum, mean, max ва ғайра медиҳад. Агрегатсияи номдор номи натиҷа ва ҷуфти «сутуни аслӣ, функсия»-ро муайян мекунад. Ин барои омехта накардани шумораи давраҳо бо давомнокии умумӣ ёрӣ медиҳад.
as_index=False калидҳоро ҳамчун сутунҳои одӣ нигоҳ медорад. Барои натиҷаи аллакай ҳосилшуда reset_index() ҳамин корро мекунад. Акнун ҳисоботро аз рӯйи майдонҳо мураттаб ва чоп кардан осон аст.
print(log.groupby("device")["hours"].agg(["sum", "max"]).to_dict("index"))
report = log.groupby("device", as_index=False).agg(
total_hours=("hours", "sum"),
sessions=("hours", "size"),
)
print(report)
print(totals.reset_index().columns.tolist())
Натиҷа:
{'A': {'sum': 6, 'max': 4}, 'B': {'sum': 8, 'max': 6}, 'C': {'sum': 3, 'max': 3}}
device total_hours sessions
0 A 6 2
1 B 8 2
2 C 3 1
['device', 'hours']
4. Чанд калид ва тартиби гурӯҳҳо
Рӯйхат дар groupby барои ҳар таркиби мавҷуд гурӯҳ месозад. Масалан, ду давраи кори як дастгоҳ дар рӯзҳои гуногун бо калиди ["device", "day"] ба гурӯҳҳои гуногун меафтанд. Таркибҳои номавҷуди калидҳои одии сатрӣ ва ададӣ худкор илова намешаванд.
Бо нобаёнӣ калидҳои гурӯҳҳо мураттаб мешаванд. sort=False тартиби бори аввал пайдо шудани гурӯҳҳоро нигоҳ медорад. Ин сатрҳои аслиро аз рӯйи давомнокӣ мураттаб намекунад: тартиби сабтҳои дохили гурӯҳ нигоҳ дошта мешавад. Калидҳои рамзиро бо сифрҳои аввала тавассути dtype ҳамчун сатр хонед, то маъно гум нашавад.
print(log.groupby(["device", "day"])["hours"].sum())
print(log.groupby("device", sort=False)["hours"].sum().index.tolist())
Натиҷа:
device day
A 1 4
2 2
B 1 2
2 6
C 1 3
Name: hours, dtype: int64
['B', 'A', 'C']
5. Интихоби сабтҳо дар ҳар гурӯҳ
Агрегати max() адади калонтаринро медиҳад, на тамоми сатри онро. groupby(...).head(k) аввалин k сатри аслии ҳар гурӯҳро нигоҳ медорад. Пас пешакӣ бо мураттабсозии умумӣ тартиби лозимро додан мумкин аст. Дар поён барои ҳар дастгоҳ то ду давраи кӯтоҳтаринро мегирем ва тартиби давомнокиҳои баробарро нигоҳ медорем.
Воситаи дигар, idxmax(), индекси аввалин сабти калонтарини ҳар гурӯҳро медиҳад. loc бо ин индекс тамоми сатрро мегирад. Агар индекс такрор шавад, loc метавонад сатрҳои зиёдатӣ гирад; аввал ягонагии индексро таъмин кунед. Қоидаи махсуси баробариро алоҳида муайян кардан лозим аст.
shortest = log.sort_values("hours", kind="stable").groupby("device").head(2)
print(shortest[["device", "hours"]].to_records(index=False).tolist())
positions = log.groupby("device")["hours"].idxmax()
print(log.loc[positions, ["device", "hours"]].to_records(index=False).tolist())
Натиҷа:
[('B', 2), ('A', 2), ('C', 3), ('A', 4), ('B', 6)]
[('A', 4), ('B', 6), ('C', 3)]
Дар дохил чӣ рӯй медиҳад
Картотекаро тасаввур кунед: калид муайян мекунад, ки рақами сатр ба кадом ҷузвдон меравад. Pandas барои ҳар калид мавқеъҳои мувофиқро меёбад, амали лозимро ба қиматҳо иҷро мекунад ва ҷавобро ҷамъ мекунад. Худи groupby талаб намекунад, ки дар коди худ барои ҳар гурӯҳ ҷадвали алоҳидаро дастӣ нусха кунед. Агрегатҳои тайёр одатан аз давраи Python аз рӯйи ҷузвдонҳо самараноктаранд.
Баъди агрегатсия як сатр ба як гурӯҳ мувофиқ аст. Баъди head(k) сатрҳо ҳанӯз ҳодисаҳои алоҳидаи аслиро ифода мекунанд. Баъди ҳар табдил маънои як сатрро санҷед.
Хатоҳои маъмул ва ислоҳи онҳо
- Танҳо
groupby-ро даъват кардан.print(log.groupby("device"))тавсифи объектро чоп мекунад, на ҳисоботро. Сутун ва агрегатро интихоб кунед, масалан["hours"].sum(). - Барои шумораи сатрҳо
countгирифтан. Ҳангоми ҷойи холӣgroups.count()сабтҳои камтар медиҳад. Агар худи ҳодисаҳоро новобаста аз пур будани майдон ҳисоб кунед,groups.size()гиред. - Ҳангоми навсозии индекс калидро гум кардан.
totals.reset_index(drop=True)номҳои дастгоҳҳоро ҳазф мекунад. Ин ҷоtotals.reset_index()беdrop=Trueлозим аст. - Бе мураттабсозӣ сабтҳои беҳтаринро интизор шудан.
log.groupby("device").head(1)давраҳои аввалро мегирад, на дарозтаринро. Аввал тартиб диҳед ёidxmax-ро бо қоидаи равшани баробарӣ истифода баред. - Танҳо аз рӯйи қисми шарт гурӯҳбандӣ кардан.
groupby("device")ҳамаи рӯзҳоро якҷо мекунад. Агар ҳисобот рӯзҳоро фарқ кунад, ҳар ду калидро бо рӯйхат диҳед.
Ёддошт
| Ҳадаф | Навишт |
|---|---|
| Ҷамъбаст аз рӯйи калид | df.groupby(key)[value].sum() |
| Сатрҳо / маълум / гуногун | size(), count(), nunique() |
| Чанд ҷамъбаст | agg(["sum", "mean", "max"]) |
| Калидҳо ҳамчун сутунҳои одӣ | as_index=False ё reset_index() |
| Калиди таркибӣ | groupby([key1, key2]) |
| Сабтҳои аввали ҳар гурӯҳ | groupby(key).head(k) |
| Индекси калонтарини гурӯҳ | groupby(key)[value].idxmax() |