Bu modul Pandas’ning kundalik "ish qurollari": qatorlarni shart bilan ajratish, saralash, guruhlab hisoblash, jadvallarni birlashtirish va sanalar bilan ishlash.
Filtrlash
Asos NumPy’dagidek — mantiqiy niqob:
import pandas as pd
df = pd.DataFrame({
"mahsulot": ["olma", "non", "sut", "olma", "non"],
"narx": [12000, 4000, 11000, 13000, 4500],
"filial": ["A", "A", "B", "B", "B"],
})
df[df["narx"] > 10000] # bitta shart
df[(df["narx"] > 4000) & (df["filial"] == "B")] # ikkita shart
df[df["mahsulot"].isin(["olma", "sut"])] # ro'yxatga kirish
Uch qat’iy qoida: shartlar & va | bilan bog’lanadi (and/or emas), har bir shart qavsga olinadi, tenglik == bilan tekshiriladi. Qavs unutilsa — TypeError, and yozilsa — ValueError: The truth value of a Series is ambiguous.
Saralash
df.sort_values("narx") # o'sish tartibida
df.sort_values("narx", ascending=False) # kamayish
df.sort_values(["filial", "narx"],
ascending=[True, False]) # avval filial, ichida narx
sort_values yangi DataFrame qaytaradi — asl jadval joyida qoladi. Saralashdan keyin indeks yorliqlari aralashadi; toza 0,1,2... kerak bo’lsa: .reset_index(drop=True).
Guruhlash va agregatlar
groupby — "bo’l, hisobla, birlashtir" andozasi: qatorlar kalit bo’yicha guruhlarga bo’linadi, har guruhga funksiya qo’llanadi:
df.groupby("mahsulot")["narx"].mean()
Natija:
mahsulot
non 4250.0
olma 12500.0
sut 11000.0
Name: narx, dtype: float64
Bir nechta agregat birdaniga:
df.groupby("filial")["narx"].agg(["count", "sum", "mean"])
Ko’p uchraydigan xato — agregatsiz df.groupby("filial") ni chiqarishga urinish: bu hali natija emas, shunchaki GroupBy obyekti. Guruhlash faqat agregat funksiya (mean, sum, count, agg...) bilan tugallanadi.
Jadvallarni ulash: concat va merge
pd.concat([df1, df2]) |
pd.merge(df1, df2, on="kalit") |
|
|---|---|---|
| Nima qiladi | jadvallarni ustma-ust (yoki yonma-yon) qo’shadi | kalit ustun qiymati mos qatorlarni juftlaydi |
| Qachon | tuzilishi bir xil bo’laklarni yig’ishda | ikki manbadagi ma’lumotni bog’lashda |
| Asosiy parametr | axis=0/1 |
how="inner"/"left"/"right"/"outer" |
mijozlar = pd.DataFrame({"id": [1, 2, 3], "ism": ["Aziz", "Malika", "Jasur"]})
buyurtma = pd.DataFrame({"id": [1, 1, 3], "summa": [50, 20, 70]})
pd.merge(mijozlar, buyurtma, on="id", how="left")
Natija:
id ism summa
0 1 Aziz 50.0
1 1 Aziz 20.0
2 2 Malika NaN
3 3 Jasur 70.0
inner — faqat ikkalasida ham bor kalitlar; left — chap jadvalning hamma qatori saqlanadi, mos kelmaganiga NaN yoziladi. Malika buyurtma qilmagan — left bo’lgani uchun qatori NaN bilan qoldi; inner bo’lganda u umuman chiqmasdi.
Sana va vaqt
CSV’dan o’qilgan sana — oddiy matn. Ishlashdan oldin uni sana turiga o’girish shart:
df = pd.DataFrame({"sana": ["2026-01-15", "2026-02-03", "2026-02-20"],
"savdo": [100, 150, 120]})
df["sana"] = pd.to_datetime(df["sana"])
df["oy"] = df["sana"].dt.month
df["hafta_kuni"] = df["sana"].dt.day_name()
df.groupby("oy")["savdo"].sum()
.dt — sana ustunining maxsus eshigi: year, month, day, day_name() va boshqalar shu orqali olinadi. Matn holicha qoldirilgan sana bilan taqqoslash ham, guruhlash ham noto’g’ri ishlaydi — info() da ustun turi datetime64 ekanini tekshirib olish odat qiling.
Amaliyot
- Yuqoridagi savdo jadvalini yozib, narxi 5000 dan yuqori VA filiali "B" bo’lgan qatorlarni ajratib oling.
- Mahsulot bo’yicha guruhlab, har birining eng arzon va eng qimmat narxini bitta
aggbilan chiqaring. - Jadvalni avval filial, ichida narx kamayishi bo’yicha saralang va indeksni tiklang.
mijozlar/buyurtmamisolinihow="inner"bilan takrorlab,leftnatijasidan farqini yozib tushuntiring.- 6 ta sanali savdo yozuvidan iborat jadval yasab, oylik jami savdoni hisoblang va eng yaxshi oyni toping.
Keyingi dars — modul testi.