Mundarija (22)
- 1. Kirish va motivatsiya
- 2. Nazariya — chuqur tushuntirish
- 2.1. loc (nom bilan)
- 2.2. iloc (pozitsiya bilan)
- 2.3. Bool indeks (filtr)
- 2.4. Bir necha shart (&, |)
- 2.5. isin, between
- 2.6. query (matn shart)
- 2.7. Shartli o'zgartirish (loc)
- 2.8. loc vs iloc — qachan qaysi
- 3. Tez ma'lumotnoma
- 4. Batafsil misollar
- Misol 1 — loc va iloc
- Misol 2 — Bool indeks (filtr)
- Misol 3 — isin, between, query
- Misol 4 — Amaliy: buyurtmalar tahlili
- 5. To'g'ri va noto'g'ri tushunishlar
- 6. Keng tarqalgan xatolar va yechimlari
- 7. Integratsiya — bu bilim qayerda kerak bo'ladi
- 8. Eng yaxshi amaliyotlar
- 9. Amaliy topshiriq
- Xulosa
24.7-dars: pandas — tanlash va filtrlash
24-QISM — MA'LUMOT TAHLILI · 7-dars
1. Kirish va motivatsiya
24.5–24.6 da DataFrame yaratdik va o'qidik. Endi tahlilning yuragi: kerakli ma'lumotni tanlash. Ma'lum qator (5-yozuv), ustun (narx), shartga mos qatorlar (100'dan qimmat mahsulotlar), ma'lum hujayra (Go narxi). Bu — pandas'da tanlash (selection) va filtrlash (filtering).
pandas ikki asosiy tanlash usuli beradi: loc (nom/belgi bilan — indeks va ustun nomi) va iloc (pozitsiya bilan — 0, 1, 2 raqami). Filtrlash — bool indeks (df[df.narx > 100] — shartga mos qatorlar), query (matn shart), isin (ro'yxatda), between (oraliq). Bu 24.3 (NumPy bool indeks) ning DataFrame versiyasi. Tanlash va filtrlash — ma'lumotdan xulosa chiqarishning birinchi qadami.
Real vaziyat. Bir tahlilda minglab tranzaksiyadan faqat "yirik summali va shubhali" larini topish kerak edi. Sikl va if bilan: uzun kod, sekin. pandas bool indeks bilan: df[(df.summa > 10000) & (df.status == "kutilmoqda")] — bir qatorda shartga mos hammasi. Filtrlash, tanlash — bir necha qatorda. Tahlilchi ma'lumotdan kerakli qismini tez ajratdi. Bool indeksni bilish — tahlilchining asosiy mahorati.
Bu darsda pandas tanlash va filtrlashni o'rganamiz.
Bu darsda:
-
loc(nom bilan) -
iloc(pozitsiya bilan) - Bool indeks (filtr)
- Bir necha shart (
&,|) isin,betweenquery(matn shart)- Shartli o'zgartirish (
loc) - Amaliy: ma'lumot tanlash
ℹ Misollarda pandas (
import pandas as pd) bilan sinaladi.
2. Nazariya — chuqur tushuntirish
2.1. loc (nom bilan)
loc — indeks va ustun nomi bilan:
df.loc["b", "nom"] # qator "b", ustun "nom"
df.loc["b"] # butun qator "b"
df.loc[:, "narx"] # butun ustun "narx"
df.loc["a":"c"] # qatorlar a dan c gacha (c KIRADI)
df.loc[["a", "c"], ["nom", "narx"]] # ba'zi qator/ustun loc — nom/belgi bilan tanlash: df.loc[qator_nomi, ustun_nomi]. df.loc["b", "nom"] (hujayra), df.loc["b"] (qator), df.loc[:, "narx"] (ustun). Kesish: df.loc["a":"c"] — locda oxiri kiradi (NumPy'dan farq!). Nomlangan indeks (sana, id) bilan ishlashda asosiy. Nom — o'qiluvchan 24.5-bob.
2.2. iloc (pozitsiya bilan)
iloc — pozitsiya (raqam) bilan:
df.iloc[0, 0] # 0-qator, 0-ustun
df.iloc[2] # 2-qator (pozitsiya)
df.iloc[:, 1] # 1-ustun (pozitsiya)
df.iloc[0:2] # 0-1 qatorlar (2 KIRMAYDI)
df.iloc[[0, 2], [0, 1]] # ba'zi pozitsiya iloc — pozitsiya (0, 1, 2) bilan tanlash (NumPy kabi): df.iloc[qator_raqam, ustun_raqam]. df.iloc[0, 0] (birinchi hujayra), df.iloc[2] (uchinchi qator), df.iloc[:, 1] (ikkinchi ustun). Kesish: df.iloc[0:2] — oxiri kirmaydi (NumPy kabi). Indeks nomi noma'lum bo'lganda yoki pozitsiya kerak bo'lganda.
2.3. Bool indeks (filtr)
Shartga mos qatorlarni tanlash:
df[df["narx"] > 100] # narx > 100 qatorlar
df[df["til"] == "uz"] # til = uz
df["narx"] > 100 # bool Series (shart) Bool indeks — shart bilan qator filtrlash (24.3 NumPy kabi): df[df["narx"] > 100] (narxi 100'dan katta qatorlar). Ichki df["narx"] > 100 — bool Series (har qator uchun True/False). Bu eng ko'p ishlatiladigan filtr usuli. Natija — shartga mos qatorlar (yangi DataFrame). Ma'lumot filtrlashning asosi.
2.4. Bir necha shart (&, |)
Murakkab shartlar:
df[(df["narx"] > 90) & (df["til"] == "uz")] # VA
df[(df["narx"] < 90) | (df["narx"] > 140)] # YOKI
df[~(df["til"] == "uz")] # EMAS (~) Bir necha shart: & (VA), | (YOKI), ~ (EMAS) — qavs bilan ((df.narx > 90) & (df.til == "uz")), Python and/or emas (24.3 kabi). Har shart bool Series, &/| element-element birlashtiradi. Qavs muhim (& ustunligi yuqori). Real tahlilda ko'p shart (masalan, sana + summa + status).
2.5. isin, between
Foydali filtr metodlari:
df[df["til"].isin(["uz", "ru"])] # ro'yxatda bor
df[df["narx"].between(90, 130)] # oraliqda (ikkalasi kiradi)
df[df["nom"].str.startswith("P")] # matn shart
df[df["nom"].str.contains("y")] # ichida bor Foydali filtrlar: .isin([ro'yxat]) (qiymat ro'yxatda bormi — ko'p == o'rniga), .between(a, b) (oraliqda — a <= x <= b), .str.startswith/.str.contains (matn shart — 04-qism satrlar). Bular ko'p shartni qisqartiradi (isin — ko'p | o'rniga). O'qiluvchan va qisqa.
2.6. query (matn shart)
Shartni matn sifatida:
df.query("narx > 100")
df.query("narx > 100 and til == 'uz'")
df.query("narx > @chegara") # o'zgaruvchi (@) query("shart") — shartni matn sifatida (SQL WHERE kabi): df.query("narx > 100"). Afzallik: qisqa, o'qiluvchan (and/or — Python kabi, qavs kam). @o'zgaruvchi — tashqi o'zgaruvchi. Bool indeksga muqobil — murakkab shartda o'qiluvchanroq. Ta'm masalasi (bool indeks yoki query).
2.7. Shartli o'zgartirish (loc)
loc bilan qiymat o'zgartirish:
df.loc[df["narx"] < 100, "narx"] = 99 # shartga mos narxni 99 ga
df.loc[df["til"] == "uz", "chegirma"] = 0.1 # yangi qiymat Shartli o'zgartirish — df.loc[shart, ustun] = qiymat: df.loc[df["narx"] < 100, "narx"] = 99 (shartga mos qatorlarda narxni o'zgartir). loc bilan (muhim — df[shart]["ustun"] = ... SettingWithCopyWarning beradi, ishlamasligi mumkin). Bu ma'lumot tozalash 24.8-bob, toifalashda kerak. loc — xavfsiz o'zgartirish usuli.
2.8. loc vs iloc — qachan qaysi
| Holat | Usul |
|---|---|
| Nomlangan indeks (sana, id) | loc |
| Pozitsiya (0, 1, 2) | iloc |
| Shartli filtr | Bool indeks / loc |
| Shartli o'zgartirish | loc |
loc — nom bilan (indeks/ustun nomi — o'qiluvchan, nomlangan ma'lumot); iloc — pozitsiya bilan (raqam — nom noma'lum bo'lganda). Filtr — bool indeks yoki loc[shart]. O'zgartirish — doim loc (xavfsiz). Qoida: nom bilan ishla (loc) — o'qiluvchan va ishonchli; pozitsiya faqat kerak bo'lganda (iloc). Bu 24.5 (nomlangan ma'lumot) tamoyilining davomi.
3. Tez ma'lumotnoma
import pandas as pd
# loc (nom bilan):
df.loc["b", "nom"] # hujayra
df.loc["b"] # qator · df.loc[:, "narx"] # ustun
df.loc["a":"c"] # kesish (oxiri KIRADI)
# iloc (pozitsiya bilan):
df.iloc[0, 0]; df.iloc[2]; df.iloc[:, 1]
df.iloc[0:2] # kesish (oxiri KIRMAYDI)
# bool indeks (filtr):
df[df["narx"] > 100]
df[(df["narx"] > 90) & (df["til"] == "uz")] # VA (& , qavs)
df[df["til"].isin(["uz", "ru"])] # ro'yxatda
df[df["narx"].between(90, 130)] # oraliq
# query:
df.query("narx > 100 and til == 'uz'")
# shartli o'zgartirish (loc bilan):
df.loc[df["narx"] < 100, "narx"] = 99Tanlash xulosasi
loc: nom bilan (oxiri kiradi) · iloc: pozitsiya (oxiri kirmaydi)
bool: df[df.a>x] · &/|/~ (qavs) · isin/between · query (matn)
o'zgartirish: df.loc[shart, ustun] = qiymat4. Batafsil misollar
Misollarda pandas (
import pandas as pd) bilan sinaladi.
Misol 1 — loc va iloc
"""loc (nom bilan): hujayra, qator, ustun; iloc (pozitsiya bilan); kesish farqi."""
import warnings
warnings.filterwarnings("ignore")
import pandas as pd
def main() -> None:
df = pd.DataFrame(
{"nom": ["Python", "Go", "Rust", "PHP"], "narx": [100, 120, 150, 80]},
index=["a", "b", "c", "d"],
)
print("=== 1. loc (nom bilan) ===")
print(f" df.loc['b','nom'] = {df.loc['b', 'nom']}")
print(f" df.loc['c','narx'] = {df.loc['c', 'narx']}")
print(f" df.loc['b'] (qator) = {df.loc['b'].to_dict()}")
print("\n=== 2. iloc (pozitsiya bilan) ===")
print(f" df.iloc[0,0] = {df.iloc[0, 0]}")
print(f" df.iloc[2,1] = {df.iloc[2, 1]}")
print("\n=== 3. Kesish farqi ===")
print(f" loc['a':'c'] (c KIRADI): {df.loc['a':'c'].index.tolist()}")
print(f" iloc[0:2] (2 KIRMAYDI): {df.iloc[0:2].index.tolist()}")
print("\n=== 4. Ustun tanlash ===")
print(f" loc[:,'narx']: {df.loc[:, 'narx'].tolist()}")
print(f" iloc[:,0]: {df.iloc[:, 0].tolist()}")
print(" ⭐ loc — nom (oxiri kiradi), iloc — pozitsiya (kirmaydi)")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. loc (nom bilan) ===
df.loc['b','nom'] = Go
df.loc['c','narx'] = 150
df.loc['b'] (qator) = {'nom': 'Go', 'narx': 120}
=== 2. iloc (pozitsiya bilan) ===
df.iloc[0,0] = Python
df.iloc[2,1] = 150
=== 3. Kesish farqi ===
loc['a':'c'] (c KIRADI): ['a', 'b', 'c']
iloc[0:2] (2 KIRMAYDI): ['a', 'b']
=== 4. Ustun tanlash ===
loc[:,'narx']: [100, 120, 150, 80]
iloc[:,0]: ['Python', 'Go', 'Rust', 'PHP']
⭐ loc — nom (oxiri kiradi), iloc — pozitsiya (kirmaydi)Nima ko'rsatdi: 2.1, 2.2, 2.8-bo'limlar.
Misol 2 — Bool indeks (filtr)
"""bool indeks: df[df.narx>100]; bir necha shart (&, |, ~); qavs bilan."""
import warnings
warnings.filterwarnings("ignore")
import pandas as pd
def main() -> None:
df = pd.DataFrame({
"nom": ["Python", "Go", "Rust", "PHP", "Ruby"],
"narx": [100, 120, 150, 80, 90],
"til": ["uz", "en", "en", "uz", "en"],
})
print("=== 1. Oddiy filtr (narx > 100) ===")
print(f" {df[df['narx'] > 100]['nom'].tolist()}")
print("\n=== 2. VA (&) — ikki shart ===")
r = df[(df["narx"] > 85) & (df["til"] == "en")]
print(f" narx>85 va til=en: {r['nom'].tolist()}")
print("\n=== 3. YOKI (|) ===")
r = df[(df["narx"] < 90) | (df["narx"] > 140)]
print(f" arzon yoki qimmat: {r['nom'].tolist()}")
print("\n=== 4. EMAS (~) va sanash ===")
r = df[~(df["til"] == "uz")]
print(f" uz emas: {r['nom'].tolist()}")
print(f" narx>100 soni: {(df['narx'] > 100).sum()}")
print(" ⭐ bool indeks — shartga mos qatorlar (&/|/~, qavs)")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. Oddiy filtr (narx > 100) ===
['Go', 'Rust']
=== 2. VA (&) — ikki shart ===
narx>85 va til=en: ['Go', 'Rust', 'Ruby']
=== 3. YOKI (|) ===
arzon yoki qimmat: ['Rust', 'PHP']
=== 4. EMAS (~) va sanash ===
uz emas: ['Go', 'Rust', 'Ruby']
narx>100 soni: 2
⭐ bool indeks — shartga mos qatorlar (&/|/~, qavs)Nima ko'rsatdi: 2.3, 2.4-bo'limlar.
Misol 3 — isin, between, query
"""isin (ro'yxatda); between (oraliq); query (matn shart); str metodlari."""
import warnings
warnings.filterwarnings("ignore")
import pandas as pd
def main() -> None:
df = pd.DataFrame({
"nom": ["Python", "Go", "Rust", "PHP", "Ruby"],
"narx": [100, 120, 150, 80, 90],
"til": ["uz", "en", "ru", "uz", "en"],
})
print("=== 1. isin (ro'yxatda) ===")
r = df[df["til"].isin(["uz", "ru"])]
print(f" til uz yoki ru: {r['nom'].tolist()}")
print("\n=== 2. between (oraliq) ===")
r = df[df["narx"].between(90, 130)]
print(f" narx 90-130: {r['nom'].tolist()}")
print("\n=== 3. query (matn shart) ===")
r = df.query("narx > 100 and til == 'en'")
print(f" narx>100 va en: {r['nom'].tolist()}")
print("\n=== 4. str metodlari (matn) ===")
r = df[df["nom"].str.contains("y")]
print(f" nomida 'y': {r['nom'].tolist()}")
print(" ⭐ isin/between/query/str — qulay filtr usullari")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. isin (ro'yxatda) ===
til uz yoki ru: ['Python', 'Rust', 'PHP']
=== 2. between (oraliq) ===
narx 90-130: ['Python', 'Go', 'Ruby']
=== 3. query (matn shart) ===
narx>100 va en: ['Go']
=== 4. str metodlari (matn) ===
nomida 'y': ['Python', 'Ruby']
⭐ isin/between/query/str — qulay filtr usullariNima ko'rsatdi: 2.5, 2.6-bo'limlar.
Misol 4 — Amaliy: buyurtmalar tahlili
Real misol: buyurtmalar jadvali — filtr (yirik buyurtmalar), shartli o'zgartirish (loc), tanlash, statistika. Bu — ma'lumot tanlash va o'zgartirishning namunasi.
"""to'liq tanlash: buyurtmalar, bool filtr, loc shartli o'zgartirish, isin, statistika."""
import warnings
warnings.filterwarnings("ignore")
import pandas as pd
def main() -> None:
df = pd.DataFrame({
"mijoz": ["Ali", "Vali", "Guli", "Ali", "Vali", "Sam"],
"summa": [5000, 15000, 3000, 25000, 8000, 12000],
"status": ["yakun", "kutilmoqda", "yakun", "kutilmoqda", "yakun", "kutilmoqda"],
})
print("=== 1. Yirik buyurtmalar (summa > 10000) ===")
yirik = df[df["summa"] > 10000]
print(f" {yirik[['mijoz', 'summa']].to_dict(orient='records')}")
print("\n=== 2. Yirik VA kutilmoqda (& shart) ===")
r = df[(df["summa"] > 10000) & (df["status"] == "kutilmoqda")]
print(f" {r['mijoz'].tolist()}, jami: {r['summa'].sum()}")
print("\n=== 3. Shartli o'zgartirish (loc — chegirma) ===")
df["chegirma"] = 0
df.loc[df["summa"] > 10000, "chegirma"] = 10 # yirikka 10%
print(f" chegirmalar: {df['chegirma'].tolist()}")
print("\n=== 4. isin va statistika ===")
faol = df[df["mijoz"].isin(["Ali", "Vali"])]
print(f" Ali+Vali buyurtmalar: {len(faol)}, jami: {faol['summa'].sum()}")
print(f" eng yirik: {df.loc[df['summa'].idxmax(), 'mijoz']}")
print(" ⭐ filtr + loc o'zgartirish — ma'lumot tanlash amaliyoti")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. Yirik buyurtmalar (summa > 10000) ===
[{'mijoz': 'Vali', 'summa': 15000}, {'mijoz': 'Ali', 'summa': 25000}, {'mijoz': 'Sam', 'summa': 12000}]
=== 2. Yirik VA kutilmoqda (& shart) ===
['Vali', 'Ali', 'Sam'], jami: 52000
=== 3. Shartli o'zgartirish (loc — chegirma) ===
chegirmalar: [0, 10, 0, 10, 0, 10]
=== 4. isin va statistika ===
Ali+Vali buyurtmalar: 4, jami: 53000
eng yirik: Ali
⭐ filtr + loc o'zgartirish — ma'lumot tanlash amaliyotiNima ko'rsatdi: 2.1–2.8-bo'limlar.
5. To'g'ri va noto'g'ri tushunishlar
| Noto'g'ri fikr | To'g'risi |
|---|---|
"loc = iloc" |
loc — nom, iloc — pozitsiya |
"loc kesish oxiri kirmaydi" |
locda kiradi (iloc kirmaydi) |
"and bilan shart" |
& (qavs bilan) |
"df[shart][ustun]=x ishlaydi" |
loc (SettingWithCopy) |
"isin — bir qiymat" |
Ro'yxat (ko'p ==) |
"query sekin/keraksiz" |
O'qiluvchan (murakkab shart) |
| "Filtr aslni o'zgartiradi" | Yangi DataFrame (nusxa) |
| "Pozitsiya doim ishlaydi" | Nomlangan indeksda loc |
6. Keng tarqalgan xatolar va yechimlari
1. and/or bool indeksda
df[(df.a > 1) and (df.b < 2)] # ⚠️ xato
df[(df.a > 1) & (df.b < 2)] # ✅ (& , qavs)2. Qavssiz &
df[df.a > 1 & df.b < 2] # ⚠️ ustunlik xato
df[(df.a > 1) & (df.b < 2)] # ✅3. df[shart][ustun] = x (chain)
df[df.a > 0]["b"] = 5 # ⚠️ SettingWithCopyWarning
df.loc[df.a > 0, "b"] = 5 # ✅4. loc/iloc kesish chalkashtirish
df.loc["a":"c"] # c KIRADI
df.iloc[0:3] # 3 KIRMAYDI # ✅ farqni bil5. locga pozitsiya
df.loc[0] # indeks "0" bo'lsa ok, aks holda xato
df.iloc[0] # ✅ pozitsiya uchun6. Ko'p == (isin o'rniga)
df[(df.til=="uz")|(df.til=="ru")] # uzun
df[df.til.isin(["uz","ru"])] # ✅ qisqa7. Filtr natijasini asl deb o'ylash
df[df.a > 0] # yangi DataFrame (asl o'zgarmaydi)
df = df[df.a > 0] # ✅ saqlash kerak bo'lsa7. Integratsiya — bu bilim qayerda kerak bo'ladi
- 24.3-dars (o'tilgan): NumPy bool indeks — asos
- 24.5-dars (o'tilgan): DataFrame — tanlash manbai
- 24.8-dars: Tozalash — loc bilan o'zgartirish
- 24.9-dars: Guruhlash — filtrlangan ma'lumot
- 23-qism (o'tilgan): SQL WHERE — filtr o'xshashi
8. Eng yaxshi amaliyotlar
Nom bilan —
loc, pozitsiya —iloc.Filtr — bool indeks (
df[df.a > x]).Ko'p shart —
&/|/~qavs bilan.O'zgartirish — doim
loc(SettingWithCopy).Ko'p
==o'rnigaisin.Oraliq —
between.Murakkab shart —
query(o'qiluvchan).Filtr — nusxa (saqlash kerak bo'lsa tayinla).
9. Amaliy topshiriq
Vazifa 1: Bashorat qiling
1. # loc nima?
2. # iloc nima?
3. # loc/iloc kesish farqi?
4. # bool indeks nima?
5. # & va | qanday?
6. # ~ nima?
7. # isin nima?
8. # between nima?
9. # query nima?
10. # shartli o'zgartirish?
11. # SettingWithCopy nima?
12. # filtr aslni o'zgartiradimi?Javoblar
- Nom (belgi) bilan tanlash
- Pozitsiya (raqam) bilan tanlash
- loc oxiri kiradi, iloc kirmaydi
- Shartga mos qatorlarni tanlash
- VA / YOKI (qavs bilan)
- EMAS
- Ro'yxatda bormi
- Oraliqda (ikkalasi kiradi)
- Shartni matn sifatida
df.loc[shart, ustun] = qiymat- View'ga yozish ogohlantirishi
- Yo'q (yangi DataFrame)
Vazifa 2: Xatolarni tuzating
1. df[(df.a>1) and (df.b<2)] # &
2. df[df.a > 1 & df.b < 2] # qavs
3. df[df.a>0]["b"] = 5 # loc
4. df.loc[0] # pozitsiya kerak # iloc
5. df[(df.t=="uz")|(df.t=="ru")] # isinJavoblar
1. df[(df.a>1) & (df.b<2)]
2. df[(df.a > 1) & (df.b < 2)]
3. df.loc[df.a > 0, "b"] = 5
4. df.iloc[0]
5. df[df.t.isin(["uz", "ru"])]Vazifa 3: loc/iloc
Tanlash:
loc(nom)iloc(pozitsiya)- Kesish farqi
- Ustun tanlash
Vazifa 4: Bool indeks
Filtr:
- Oddiy shart
&(VA)|(YOKI)~(EMAS)
Vazifa 5: Metodlar
Filtr:
isinbetweenquerystr.contains
Vazifa 6: Amaliy
Tahlil:
- Filtr (bool)
loco'zgartirishisin- Statistika
Vazifa 7: O'ylash
pandas ikki tanlash usuli beradi: loc (nom bilan — df.loc["2024-01", "narx"]) va iloc (pozitsiya bilan — df.iloc[0, 2]). Bool indeks filtrlash SQL WHERE'ga o'xshaydi. Nima uchun "nom bilan tanlash" (label-based) pozitsiyadan afzalroq (ko'p holda), va bu 24.5 dagi "nomlangan ma'lumot" tamoyilining davomi — nega df.loc[shart, ustun] = x df[shart][ustun] = x dan xavfsizroq?
Javob
Qisqa javob: loc (nom bilan) pozitsiyadan (iloc) afzalroq, chunki: o'qiluvchan (df.loc["2024-01", "narx"] — aniq; df.iloc[0, 2] — nima?), chidamli (ustun tartibi o'zgarsa, nom ishlaydi; pozitsiya buziladi). Bu 24.5 (nomlangan ma'lumot) davomi. df.loc[shart, ustun] = x df[shart][ustun] = x dan xavfsizroq, chunki: df[shart]["ustun"] = x ikki qadam (avval df[shart] — nusxa yoki view? noaniq; keyin unga yozish) — pandas ogohlantiradi (SettingWithCopyWarning) va ba'zan ishlamaydi (nusxaga yoziladi, asl o'zgarmaydi). df.loc[shart, ustun] = x — bir amal (aniq, ishonchli). "Aniq, bir amal" — noaniq, ikki qadamdan yaxshi.
1. Nom vs pozitsiya
| iloc (pozitsiya) | loc (nom) |
|---|---|
df.iloc[0, 2] |
df.loc["a", "narx"] |
| "0, 2 nima?" | aniq |
| Tartib o'zgarsa buziladi | Nom ishlaydi |
2. Chidamlik
Ustun qo'shilsa/tartib o'zgarsa: pozitsiya (iloc[:, 2]) — noto'g'ri ustun; nom (loc[:, "narx"]) — to'g'ri. Nom — o'zgarishga chidamli.
3. loc o'zgartirish xavfsizligi
df[shart]["ustun"] = x:
df[shart]— nusxa yoki view? (noaniq)- Unga yozish — nusxaga bo'lsa, asl o'zgarmaydi (jimgina xato!)
SettingWithCopyWarningogohlantiradi
df.loc[shart, "ustun"] = x:
- Bir amal (aniq)
- Aslga yoziladi (ishonchli)
4. "Bir amal, aniq"
Ikki qadam (df[shart] keyin [ustun]=) — oraliqda noaniqlik (nusxa?). Bir amal (loc[shart, ustun]=) — aniq, ishonchli. "Aniq, atomik amal — noaniq, bosqichli emas".
5. Muhandislik saboqlari
- Nom — o'qiluvchan, chidamli (pozitsiya emas)
loco'zgartirish — bir amal (xavfsiz)- Chain (
[][]=) — noaniq (nusxa?) - Nomlangan ma'lumot tamoyili 24.5-bob davomi
6. Xulosa
loc(nom) — o'qiluvchan, chidamliiloc— faqat pozitsiya kerak bo'lgandadf.loc[shart, ustun]=x— xavfsiz (bir amal)- Chain — SettingWithCopy (noaniq)
Nimani mustahkamlaydi: 2.1–2.8-bo'limlar.
Xulosa
Bu darsda pandas tanlash va filtrlashni o'rgandik.
Eng muhim uch fikr:
loc(nom) vailoc(pozitsiya).loc— indeks va ustun nomi bilan:df.loc[qator_nomi, ustun_nomi](df.loc["b", "nom"]— hujayra,df.loc["b"]— qator,df.loc[:, "narx"]— ustun). Kesishda oxiri kiradi (df.loc["a":"c"]— c ham).iloc— pozitsiya (0, 1, 2) bilan (NumPy kabi):df.iloc[0, 0],df.iloc[2], kesishda oxiri kirmaydi. Qoida: nom bilan ishla (loc— o'qiluvchan, chidamli), pozitsiya faqat kerak bo'lganda (iloc).Bool indeks va filtr metodlari. Bool indeks — shart bilan qator filtrlash:
df[df["narx"] > 100]. Bir necha shart:&(VA),|(YOKI),~(EMAS) — qavs bilan ((df.narx > 90) & (df.til == "uz")), Pythonand/oremas. Foydali metodlar:.isin([ro'yxat])(ko'p==o'rniga),.between(a, b)(oraliq),.str.contains/.str.startswith(matn),query("narx > 100 and til == 'uz'")(matn shart — o'qiluvchan). Filtr — yangi DataFrame (asl o'zgarmaydi).Shartli o'zgartirish va
locxavfsizligi. Shartli o'zgartirish —df.loc[shart, ustun] = qiymat(df.loc[df["narx"] < 100, "narx"] = 99).locbilan muhim:df[shart]["ustun"] = x(chain)SettingWithCopyWarningberadi va ba'zan ishlamaydi (nusxaga yoziladi) —df.loc[shart, ustun] = xbir amal (aniq, ishonchli).loc(nom bilan) pozitsiyadan afzalroq — o'qiluvchan (df.loc["2024-01", "narx"]vsdf.iloc[0, 2]), chidamli (ustun tartibi o'zgarsa ishlaydi). Bu 24.5 (nomlangan ma'lumot) tamoyilining davomi — SQL WHERE'ga o'xshash filtr.
Keyingi darsda pandas: tozalash ni o'rganamiz: bo'sh qiymatlar, dublikatlar, noto'g'ri turlar — real "iflos" ma'lumotni tahlilga tayyorlash.
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!