Mundarija (22)
- 1. Kirish va motivatsiya
- 2. Nazariya — chuqur tushuntirish
- 2.1. Topish (duplicated)
- 2.2. O'chirish (drop_duplicates)
- 2.3. Qism dublikat (subset)
- 2.4. Qaysini qoldirish (keep)
- 2.5. Dublikat sababi
- 2.6. Dublikat amaliyoti
- 2.7. Dublikat tuzoqlari
- 2.8. Dublikatlar — statistikani buzadi
- 3. Tez ma'lumotnoma
- 4. Batafsil misollar
- Misol 1 — Topish (duplicated)
- Misol 2 — O'chirish (drop_duplicates)
- Misol 3 — Qism dublikat (subset)
- Misol 4 — keep (first/last/False)
- 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
6.2-dars: Dublikatlar
6-QISM — MA'LUMOTNI TOZALASH · 2-dars
1. Kirish va motivatsiya
Ma'lumotda takrorlangan qatorlar (dublikatlar, duplicates) — iflos ma'lumotning yana bir keng tarqalgan muammosi. Bir mijoz ikki marta ro'yxatga olingan, ma'lumot ikki manbadan birlashtirilganda takrorlangan, yoki xatolik bilan nusxalangan. Dublikatlar statistikani buzadi: sanoq ko'p ko'rinadi (100 mijoz o'rniga 120), o'rtacha egiladi (bir qiymat ikki marta), model bir xil ma'lumotni ortiqcha o'rganadi. Bu darsda dublikatlarni topish (duplicated), o'chirish (drop_duplicates), va qism dublikat (faqat ba'zi ustunlar bir xil — masalan bir xil email, turli sana). Nega muhim? (1) Buzadi — sanoq, o'rtacha, model; (2) Yashirin — ko'rinmaydi (topish kerak); (3) Qism — to'liq emas, ba'zi ustun (email). Bu dars dublikatlarni o'rgatadi — topish va o'chirish.
Dublikatlar (duplicates) — takrorlangan qatorlar: topish (duplicated() — True/False; .sum() — soni), o'chirish (drop_duplicates() — birinchisini qoldir), qism dublikat (subset=["email"] — faqat ba'zi ustun), qaysini qoldirish (keep="first"/"last"/False), sabab (ikki marta kiritish, birlashtirish, nusxa). Foydalanish: buzilgan statistikani tuzatish, toza ma'lumot. Bu 6.1 (yetishmayotgan), 3.5 (filtrlash), 6.11 (tozalash quvuri) bilan bog'liq. Dublikatlar — topish va o'chirish. Takror. Toza.
Real vaziyat. Data Scientist mijoz ro'yxatini (email, ism, xarid) tahlil qilmoqchi. Iflos ma'lumot: 1000 qator, lekin ba'zi mijozlar ikki marta (email bir xil — ro'yxatga ikki marta olingan). df.duplicated().sum() (50 ta to'liq dublikat) — df.drop_duplicates() (o'chir → 950). Lekin qism dublikat: bir email, lekin turli xarid sana (bir mijoz — ikki xarid; bu dublikat emas, haqiqiy). df.duplicated(subset=["email"]) (email bo'yicha — 80 ta; lekin turli xarid — saqla). Data Scientist topdi (duplicated), farqladi (to'liq dublikat vs bir mijoz ko'p xarid), o'chirdi (haqiqiy dublikat). Dublikatlar — topish, farqlash, o'chirish.
Bu darsda dublikatlarni o'rganamiz.
Bu darsda:
- Topish (duplicated)
- O'chirish (drop_duplicates)
- Qism dublikat (subset)
- Qaysini qoldirish (keep)
- Dublikat sababi
- Dublikat amaliyoti
- Dublikat tuzoqlari
- Amaliy: dublikat hal qilish
ℹ Misollar real pandas bilan (Python 3.14) ishlaydi.
2. Nazariya — chuqur tushuntirish
2.1. Topish (duplicated)
Takrorlangan qatorlar:
import pandas as pd
# duplicated() — har qator: takrormi? (True/False)
# birinchi ko'rinishi False, keyingilari True
df.duplicated()
# nechta dublikat (birinchidan keyingilar)
df.duplicated().sum()
# dublikat qatorlarni ko'rish
df[df.duplicated()] Topish (duplicated) — takrorlangan qatorlar: df.duplicated() (har qator — takrormi? True/False; birinchi ko'rinish False (asl), keyingilari True (nusxa)), df.duplicated().sum() (dublikat soni — birinchidan keyingilar), df[df.duplicated()] (dublikat qatorlar — ko'rish). Sabab: dublikat yashirin (ko'rinmaydi — 1000 qator ichida 50 nusxa; topish kerak); duplicated — har qator boshqa qatorga tengmi (barcha ustun bir xil). duplicated (True — nusxa), .sum() (soni), birinchi False (asl saqlanadi). Topish — duplicated (takrormi; birinchi False). Topish. Takror.
2.2. O'chirish (drop_duplicates)
Nusxalarni olib tashlash:
import pandas as pd
# drop_duplicates() — dublikatni o'chir (birinchini qoldir)
df.drop_duplicates()
# reset index (o'chirilgandan keyin)
df.drop_duplicates().reset_index(drop=True) O'chirish (drop_duplicates) — nusxalarni olib tashlash: df.drop_duplicates() (dublikat qatorlarni o'chir; birinchisini qoldir — keep="first" standart); .reset_index(drop=True) (o'chirilgandan keyin — indeks qayta 0, 1, 2). Sabab: dublikat o'chirilishi kerak (statistika to'g'ri — 950 mijoz, 1000 emas); birinchi qoldiriladi (asl — nusxa o'chadi); reset_index (o'chirilgan qator — indeks bo'shliq; qayta tartibla). drop_duplicates (o'chir), birinchi qoldir (asl), reset_index (indeks tuzat). O'chirish — drop_duplicates (nusxa o'chir; birinchi qoldir). O'chirish. drop_duplicates.
2.3. Qism dublikat (subset)
Qism dublikat (subset) — ba'zi ustun: df.duplicated(subset=["email"]) yoki df.drop_duplicates(subset=["email"]) — faqat ko'rsatilgan ustun(lar) bo'yicha dublikat (butun qator emas — faqat email bir xil). Sabab: to'liq dublikat (barcha ustun bir xil — aniq nusxa) vs qism dublikat (ba'zi ustun bir xil — email, lekin turli sana/xarid); kontekst — qaysi ustun noyob bo'lishi kerak (email — bir mijoz; email takror — nusxa yoki ko'p xarid?). subset (ustun(lar) — noyob bo'lishi kerak), kontekst (email — mijoz; id — yozuv). Qism dublikat — subset (ba'zi ustun; noyob). Qism. subset.
2.4. Qaysini qoldirish (keep)
Qaysini qoldirish (keep) — first/last/False: keep="first" (birinchisini qoldir — standart; keyingilar o'chadi), keep="last" (oxirgisini qoldir — birinchilar o'chadi; masalan eng yangi yozuv), keep=False (barcha dublikatni o'chir — bironta ham qoldirma; dublikat bo'lganlar to'liq ketadi). Sabab: qaysi nusxani saqlash (kontekst — birinchi eski, oxirgi yangi; yoki hech biriga ishonma — False); keep="last" (yangi ma'lumot — oxirgi yozuv), keep=False (dublikat — shubhali, hammasi o'chir). first (birinchi — standart), last (oxirgi — yangi), False (hammasi). Qaysini qoldirish — keep (first/last/False). keep. Qoldir.
2.5. Dublikat sababi
Dublikat sababi — nega paydo bo'ldi: ikki marta kiritish (foydalanuvchi ikki marta yubordi — forma; qo'sha bosish), birlashtirish (ikki manba merge/concat — 3.9; bir yozuv ikki jadvalda), nusxa (ma'lumot eksporti/importi — takror), JOIN xatosi (SQL — bir-ko'p bog'lanish — qatorlar ko'paydi). Sabab: sabab — oldini olish (nega paydo bo'ldi — jarayonni tuzat; birlashtirish — kalit tekshir); "dublikat — jarayon muammosi" (topib o'chirish — vaqtincha; sabab — doimiy). Kiritish (forma — validatsiya), birlashtirish (merge — kalit), nusxa (import — tekshir). Dublikat sababi — kiritish/birlashtirish/nusxa (oldini ol). Sabab. Jarayon.
2.6. Dublikat amaliyoti
Dublikat amaliyoti: topish (df.duplicated().sum() — to'liq dublikat soni); ko'rish (df[df.duplicated(keep=False)] — barcha dublikat — tekshir); qism (df.duplicated(subset=["email"]) — ba'zi ustun; kontekst — noyob); farqlash (to'liq dublikat vs qism — email takror, lekin turli xarid — haqiqiy); o'chirish (df.drop_duplicates(subset=..., keep="first")); reset_index (indeks tuzat); tekshir (df.duplicated().sum() — 0). Tuzoqlar: qism ko'r-ko'rona (email o'chir — ko'p xarid yo'q), keep noto'g'ri (eski saqlanadi), reset_index unut (indeks bo'shliq), sabab e'tiborsiz (yana paydo bo'ladi), noyob emas ustun (o'chirish xato). Amaliyot — topish, farqlash, o'chirish, tekshir. Takror. Toza.
2.7. Dublikat tuzoqlari
Dublikat asosiy tuzoqlari: qism dublikat ko'r-ko'rona (drop_duplicates(subset=["email"]) — email takror o'chir; lekin bir mijoz ko'p xarid (email bir, sana turli — haqiqiy, dublikat EMAS); farqla — kontekst); keep noto'g'ri (keep="first" — birinchi (eski) qoldir; lekin eng yangi kerak bo'lsa — keep="last"; noto'g'ri nusxa saqlanadi); reset_index unut (dublikat o'chirilgach — indeks bo'shliq (0, 1, 3, 5; 2, 4 ketdi); reset_index(drop=True) — 0, 1, 2); sabab e'tiborsiz (dublikat o'chir, lekin sabab (jarayon — ikki marta kiritish, merge xato) tuzatilmasa — yana paydo; sabab tuzat); statistika oldin (dublikat o'chirmasdan statistika — sanoq/o'rtacha egilgan (100 → 120; bir qiymat ikki marta); tozala, keyin tahlil); noyob emas ustun (subset — noyob bo'lishi kerak ustun (email, id); noyob EMAS (yosh, shahar) — ko'p qator o'chir (soxta dublikat)); inplace/tayinlash (df.drop_duplicates() — yangi DataFrame; df = ... yoki inplace=True); katta-kichik harf/bo'shliq ("Ali" vs "ali " — turli deb (dublikat emas); avval normallashtir (matn tozalash — 6.7; keyin dublikat)). Sabab: dublikat kontekst/jarayon nozik (qism, keep, sabab, noyob — xato o'chirish yoki yana paydo). Yechim: farqla (qism), to'g'ri keep, reset_index, sabab tuzat, noyob ustun. Tuzoqlar — qism, keep, reset_index, sabab.
2.8. Dublikatlar — statistikani buzadi
Dublikat asosiy g'oyasi — statistikani buzadi: takrorlangan qatorlar (dublikat — ikki marta kiritish, birlashtirish, nusxa) yashirin (ko'rinmaydi) va buzadi (sanoq ko'p — 100 → 120; o'rtacha egilgan — bir qiymat ikki marta; model ortiqcha o'rganadi). Topish (df.duplicated().sum() — soni; df[df.duplicated()] — ko'rish), o'chirish (df.drop_duplicates() — birinchi qoldir; reset_index), qism dublikat (subset=["email"] — ba'zi ustun; kontekst — noyob), qaysini qoldirish (keep="first"/"last"/False), sabab (kiritish/birlashtirish/nusxa — oldini ol). Foydalanish: buzilgan statistikani tuzatish (sanoq, o'rtacha — to'g'ri), toza ma'lumot (model — ortiqcha emas; ML 20-qism). Tuzoqlar: qism ko'r-ko'rona (ko'p xarid yo'q), keep noto'g'ri (eski), reset_index unut, sabab e'tiborsiz (yana paydo), noyob emas ustun (soxta dublikat), katta-kichik harf (normallashtir — 6.7). Bu 6.1 (yetishmayotgan), 3.9 (merge/concat — birlashtirish), 6.7 (matn tozalash), 6.11 (tozalash quvuri) bilan. Dublikatlar — topish (duplicated) va o'chirish (drop_duplicates); statistikani buzadi. Takror. Toza. Buzadi.
3. Tez ma'lumotnoma
import pandas as pd
# TOPISH:
df.duplicated() # har qator: takrormi? (birinchi False)
df.duplicated().sum() # dublikat soni
df[df.duplicated(keep=False)] # barcha dublikat (ko'rish)
# O'CHIRISH:
df.drop_duplicates() # birinchini qoldir
df.drop_duplicates().reset_index(drop=True) # indeks tuzat
# QISM DUBLIKAT (ba'zi ustun — noyob):
df.duplicated(subset=["email"])
df.drop_duplicates(subset=["email"])
# QAYSINI QOLDIRISH (keep):
df.drop_duplicates(keep="first") # birinchi (standart — eski)
df.drop_duplicates(keep="last") # oxirgi (yangi)
df.drop_duplicates(keep=False) # hammasini o'chir (dublikat shubhali)
# SABAB: ikki marta kiritish · birlashtirish (merge) · nusxa · JOIN xato
QOIDA: to'liq vs qism (email — ko'p xarid?) · to'g'ri keep · reset_index · sababDublikatlar xulosasi
Dublikatlar — takrorlangan qatorlar (statistikani buzadi)
Topish — duplicated() (takrormi; birinchi False)
O'chirish — drop_duplicates() (birinchini qoldir; reset_index)
Qism dublikat — subset (email — kontekst; ko'p xarid emas)
keep — first (eski) / last (yangi) / False (hammasi)4. Batafsil misollar
Misollar real pandas bilan (Python 3.14) ishlaydi.
Misol 1 — Topish (duplicated)
"""Dublikatni topish (real pandas)."""
import pandas as pd
def main() -> None:
df = pd.DataFrame({
"email": ["a@x.uz", "b@x.uz", "a@x.uz", "c@x.uz", "b@x.uz"],
"ism": ["Ali", "Vali", "Ali", "Guli", "Vali"],
"xarid": [100, 200, 100, 300, 200],
})
print("=== 1. duplicated (har qator) ===")
print(f" {df.duplicated().tolist()}")
print(" birinchi False, nusxa True")
print("\n=== 2. Dublikat soni ===")
print(f" soni: {int(df.duplicated().sum())}")
print("\n=== 3. Dublikat qatorlar ===")
dubl = df[df.duplicated()]
print(f" nusxa qatorlar: {dubl['email'].tolist()}")
print("\n=== 4. Barcha dublikat (keep=False) ===")
barcha = df[df.duplicated(keep=False)]
print(f" jami (asl + nusxa): {len(barcha)} qator")
print(" ⭐ Topish — duplicated (takror)")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. duplicated (har qator) ===
[False, False, True, False, True]
birinchi False, nusxa True
=== 2. Dublikat soni ===
soni: 2
=== 3. Dublikat qatorlar ===
nusxa qatorlar: ['a@x.uz', 'b@x.uz']
=== 4. Barcha dublikat (keep=False) ===
jami (asl + nusxa): 4 qator
⭐ Topish — duplicated (takror)Nima ko'rsatdi: 2.1-bo'lim.
Misol 2 — O'chirish (drop_duplicates)
"""O'chirish: drop_duplicates (real pandas)."""
import pandas as pd
def main() -> None:
df = pd.DataFrame({
"email": ["a@x.uz", "b@x.uz", "a@x.uz", "c@x.uz", "b@x.uz"],
"xarid": [100, 200, 100, 300, 200],
})
print("=== 1. Asl (5 qator) ===")
print(f" qatorlar: {len(df)}")
print("\n=== 2. drop_duplicates (birinchini qoldir) ===")
toza = df.drop_duplicates()
print(f" qoldi: {len(toza)} qator (2 nusxa o'chdi)")
print("\n=== 3. reset_index (indeks tuzat) ===")
toza2 = df.drop_duplicates().reset_index(drop=True)
print(f" indeks: {toza2.index.tolist()}")
print("\n=== 4. Statistika farqi ===")
print(f" asl o'rtacha xarid: {df['xarid'].mean().round(1)}")
print(f" toza o'rtacha xarid: {toza['xarid'].mean().round(1)}")
print(" ⭐ O'chirish — drop_duplicates (statistika tuzatildi)")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. Asl (5 qator) ===
qatorlar: 5
=== 2. drop_duplicates (birinchini qoldir) ===
qoldi: 3 qator (2 nusxa o'chdi)
=== 3. reset_index (indeks tuzat) ===
indeks: [0, 1, 2]
=== 4. Statistika farqi ===
asl o'rtacha xarid: 180.0
toza o'rtacha xarid: 200.0
⭐ O'chirish — drop_duplicates (statistika tuzatildi)Nima ko'rsatdi: 2.2-bo'lim.
Misol 3 — Qism dublikat (subset)
"""Qism dublikat: subset (real pandas)."""
import pandas as pd
def main() -> None:
# bir mijoz (email) ko'p xarid qilishi mumkin (dublikat EMAS)
df = pd.DataFrame({
"email": ["a@x.uz", "a@x.uz", "b@x.uz", "a@x.uz"],
"sana": ["01-01", "01-05", "01-02", "01-01"],
"xarid": [100, 200, 150, 100],
})
print("=== 1. To'liq dublikat (barcha ustun) ===")
print(f" to'liq dublikat soni: {int(df.duplicated().sum())}")
print(" (a@x.uz, 01-01, 100 — 2 marta)")
print("\n=== 2. Email bo'yicha (subset) ===")
email_dubl = df.duplicated(subset=["email"]).sum()
print(f" email takror: {int(email_dubl)}")
print("\n=== 3. Farq (kontekst) ===")
print(" a@x.uz — 3 marta, lekin turli sana/xarid")
print(" to'liq dublikat (1 ta) — haqiqiy nusxa")
print(" email takror (2 ta) — ba'zisi ko'p xarid")
print("\n=== 4. To'g'ri o'chirish (to'liq dublikat) ===")
toza = df.drop_duplicates() # to'liq (ko'p xarid saqlanadi)
print(f" qoldi: {len(toza)} qator (ko'p xarid saqlandi)")
print(" ⭐ Qism dublikat — subset (kontekst muhim)")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. To'liq dublikat (barcha ustun) ===
to'liq dublikat soni: 1
(a@x.uz, 01-01, 100 — 2 marta)
=== 2. Email bo'yicha (subset) ===
email takror: 2
=== 3. Farq (kontekst) ===
a@x.uz — 3 marta, lekin turli sana/xarid
to'liq dublikat (1 ta) — haqiqiy nusxa
email takror (2 ta) — ba'zisi ko'p xarid
=== 4. To'g'ri o'chirish (to'liq dublikat) ===
qoldi: 3 qator (ko'p xarid saqlandi)
⭐ Qism dublikat — subset (kontekst muhim)Nima ko'rsatdi: 2.3-bo'lim.
Misol 4 — keep (first/last/False)
"""keep: qaysini qoldirish (real pandas)."""
import pandas as pd
def main() -> None:
df = pd.DataFrame({
"id": [1, 2, 1, 3],
"holat": ["eski", "bir", "yangi", "uch"],
})
print("=== 1. keep='first' (birinchi — eski) ===")
first = df.drop_duplicates(subset=["id"], keep="first")
print(f" id=1 holat: {first[first['id'] == 1]['holat'].values}")
print("\n=== 2. keep='last' (oxirgi — yangi) ===")
last = df.drop_duplicates(subset=["id"], keep="last")
print(f" id=1 holat: {last[last['id'] == 1]['holat'].values}")
print("\n=== 3. keep=False (hammasini o'chir) ===")
none = df.drop_duplicates(subset=["id"], keep=False)
print(f" qoldi: {len(none)} qator (id=1 to'liq ketdi)")
print("\n=== 4. Qachon qaysi ===")
print(" first — asl; last — yangi yozuv; False — shubhali")
print(" ⭐ keep — first/last/False (kontekst)")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. keep='first' (birinchi — eski) ===
id=1 holat: <StringArray>
['eski']
Length: 1, dtype: str
=== 2. keep='last' (oxirgi — yangi) ===
id=1 holat: <StringArray>
['yangi']
Length: 1, dtype: str
=== 3. keep=False (hammasini o'chir) ===
qoldi: 2 qator (id=1 to'liq ketdi)
=== 4. Qachon qaysi ===
first — asl; last — yangi yozuv; False — shubhali
⭐ keep — first/last/False (kontekst)Nima ko'rsatdi: 2.4-bo'lim.
5. To'g'ri va noto'g'ri tushunishlar
| Noto'g'ri fikr | To'g'risi |
|---|---|
| "dublikat ko'rinadi" | Yashirin (topish kerak) |
| "email takror = dublikat" | Ko'p xarid bo'lishi mumkin |
| "drop_duplicates yetarli" | Sabab tuzat (yana paydo) |
| "keep muhim emas" | first/last (kontekst) |
| "har ustun subset" | Noyob ustun (email, id) |
| "reset_index kerakmas" | Indeks bo'shliq |
| "'Ali' = 'ali '" | Normallashtir (6.7) |
| "dublikat zararsiz" | Statistikani buzadi |
6. Keng tarqalgan xatolar va yechimlari
1. Qism dublikat ko'r-ko'rona
df.drop_duplicates(subset=["email"]) # ko'p xarid yo'q # ⚠️
df.drop_duplicates() # to'liq (ko'p xarid saqlanadi) # ✅2. keep noto'g'ri
df.drop_duplicates(keep="first") # eski saqlanadi # ⚠️
df.drop_duplicates(keep="last") # yangi (kerak bo'lsa) # ✅3. reset_index unutish
df.drop_duplicates() # indeks: 0, 1, 3, 5 (bo'shliq) # ⚠️
df.drop_duplicates().reset_index(drop=True) # 0, 1, 2 # ✅4. Sabab e'tiborsiz
df.drop_duplicates() # yana paydo bo'ladi (jarayon) # ⚠️
# forma validatsiya / merge kalit tekshir # ✅5. Statistika oldin tozalash
df["x"].mean() # dublikat bilan (egilgan) # ⚠️
df.drop_duplicates()["x"].mean() # tozalab # ✅6. Noyob emas ustun
df.drop_duplicates(subset=["shahar"]) # ko'p qator o'chir # ⚠️
df.drop_duplicates(subset=["email"]) # noyob # ✅7. Katta-kichik harf
# "Ali" va "ali " — turli deb (dublikat topilmas) # ⚠️
df["ism"] = df["ism"].str.strip().str.lower() # normallashtir # ✅7. Integratsiya — bu bilim qayerda kerak bo'ladi
- 6.1-dars (o'tilgan): Yetishmayotgan qiymatlar
- 3.9-dars (o'tilgan): Merge/concat (birlashtirish)
- 6.7-dars: Matn tozalash (normallashtirish)
- 6.11-dars: Tozalash quvuri
- 20-qism (reja): ML (toza ma'lumot)
8. Eng yaxshi amaliyotlar
Topish —
df.duplicated().sum().Ko'rish —
keep=False(barcha).Qism —
subset(noyob ustun).Farqla — to'liq vs qism (ko'p xarid).
keep — first/last (kontekst).
reset_index — indeks tuzat.
Sabab — jarayon tuzat (yana paydo).
Normallashtir — avval 6.7-bob, keyin dublikat.
9. Amaliy topshiriq
Vazifa 1: Bashorat qiling
1. # dublikat nima?
2. # duplicated nima?
3. # birinchi True mi?
4. # drop_duplicates?
5. # subset nima?
6. # keep first?
7. # keep last?
8. # keep False?
9. # email takror = dublikat?
10. # reset_index nega?
11. # dublikat sababi?
12. # nega buzadi?Javoblar
- Takrorlangan qator
- Takrormi? (True/False)
- Yo'q (birinchi False, nusxa True)
- Dublikat o'chir (birinchi qoldir)
- Ba'zi ustun (noyob)
- Birinchi (eski) qoldir
- Oxirgi (yangi) qoldir
- Hammasini o'chir
- Yo'q (ko'p xarid bo'lishi mumkin)
- Indeks bo'shliq (tuzat)
- Kiritish/birlashtirish/nusxa
- Sanoq, o'rtacha egiladi
Vazifa 2: Xatolarni tuzating
1. df.drop_duplicates(subset=["email"]) # ko'p xarid
2. df.drop_duplicates(keep="first") # yangi kerak
3. df.drop_duplicates() # indeks bo'shliq
4. df.drop_duplicates() # yana paydo
5. df.drop_duplicates(subset=["shahar"])Javoblar
1. drop_duplicates() (to'liq — barcha ustun)
2. keep="last" (yangi)
3. .reset_index(drop=True)
4. jarayon tuzat (forma/merge)
5. subset=["email"] (noyob)Vazifa 3: Topish
Modellang:
- duplicated
- sum
- keep=False
- Ko'rish
Vazifa 4: O'chirish
Modellang:
- drop_duplicates
- Birinchi qoldir
- reset_index
- Statistika tuzat
Vazifa 5: Qism va keep
Modellang:
- subset
- Noyob ustun
- keep first/last
- Kontekst
Vazifa 6: Integratsiya
Modellang:
- Merge (3.9)
- Matn (6.7)
- Quvur (6.11)
- ML (20)
Vazifa 7: O'ylash
Dublikatlar oddiy ko'rinadi — takrorlangan qatorni o'chirish. Lekin "qism dublikat" (bir email, turli xarid) haqiqiy ma'lumot bo'lishi mumkin, va uni ko'r-ko'rona o'chirish ma'lumot yo'qotadi. Nima uchun dublikatni o'chirish domen (soha) bilimini talab qiladi, va nima uchun sababni tuzatish (topish emas) muhimroq?
Javob
Qisqa javob: Dublikat oddiy ko'rinadi (takror o'chir), lekin qism dublikat (bir email, turli xarid) haqiqiy bo'lishi mumkin (ko'r-ko'rona o'chirish — ma'lumot yo'q); dublikat o'chirish domen bilimi talab qiladi, sababni tuzatish (topish emas) muhimroq, chunki: (1) qism dublikat noaniq — email takror → dublikat (nusxa) yoki haqiqiy (bir mijoz ko'p xarid)?; kontekst hal qiladi (email — mijoz, lekin sana/xarid turli — haqiqiy; barcha ustun bir xil — nusxa); ko'r-ko'rona subset=["email"] — ko'p xaridni o'chir (ma'lumot yo'q); (2) domen bilimi — qaysi ustun noyob bo'lishi kerak (email — bir mijoz? yoki bir mijoz ko'p email? — soha; tranzaksiya id — noyob; email — noyob emas (ko'p xarid)); soha ma'lumot ma'nosini biladi (Data Scientist yolg'iz emas — domen eksperti); (3) sabab > topish — dublikat o'chir (vaqtincha — bu safar toza); lekin sabab (jarayon — ikki marta kiritish, merge xato) tuzatilmasa — yana paydo (keyingi import — yana dublikat; abadiy o'chirib yurish); sabab tuzat (forma validatsiya, merge kalit — doimiy); (4) ildiz sabab — "muammoni o'chir" (dublikat) vs "sababni tuzat" (jarayon); ildiz sabab (root cause — doimiy yechim). "Nega domen bilimi": (a) ma'no — ma'lumot ma'nosi (email — mijoz? yozuv? — soha; noyoblik qoidasi); (b) noyob kalit — qaysi ustun(lar) noyob (biznes qoida — bir mijoz bir email? tranzaksiya — id + sana?); (c) haqiqiy vs nusxa (ko'p xarid — haqiqiy; nusxa — xato; farq — kontekst); (d) yo'qotish xavfi (noto'g'ri o'chirish — haqiqiy ma'lumot yo'q; qaytmas). "Nega sabab muhimroq": (1) doimiy (sabab tuzat — yana paydo bo'lmaydi; o'chirish — vaqtincha); (2) jarayon (dublikat — jarayon muammosi; forma/merge/import — tuzat); (3) oldini olish (sabab — kelib chiqmasin; o'chirish — kelganini tozala); (4) samaradorlik (har safar o'chirish — ish; sabab — bir marta). "Amaliy": (1) kontekst (domen — noyob kalit; email/id); (2) farqla (to'liq dublikat vs qism — ko'p xarid); (3) sabab (jarayon — forma validatsiya, merge kalit); (4) oldini ol (kelib chiqmasin). Saboqlar: dublikat domen (noyob kalit — ma'no; qism — haqiqiy?); sabab > topish (doimiy — jarayon tuzat); ildiz sabab (o'chirish — vaqtincha, sabab — doimiy). To'g'ri: dublikat — domen (kontekst — noyob, qism farqla); sabab tuzat (jarayon — doimiy); ildiz sabab. Muvozanat: o'chirish (bu safar toza) + sabab (doimiy — yana paydo bo'lmasin). Bu Data Science tozalash asosiy (dublikat — domen, sabab; qism farqla; ildiz sabab). Dublikatlar — domen (kontekst) va sabab (jarayon — o'chirishdan muhimroq).
1. Nega domen bilimi
- Ma'no (email — mijoz? yozuv? — soha)
- Noyob kalit (biznes qoida — email/id)
- Haqiqiy vs nusxa (ko'p xarid — haqiqiy)
- Yo'qotish xavfi (noto'g'ri o'chir — qaytmas)
2. Nega sabab muhimroq
- Doimiy (sabab tuzat — yana paydo yo'q)
- Jarayon (forma/merge/import — tuzat)
- Oldini olish (kelib chiqmasin)
- Samaradorlik (bir marta — har safar emas)
3. O'chirish vs sabab
| O'chirish (topish) | Sabab (jarayon) |
|---|---|
| Vaqtincha (bu safar) | Doimiy |
| Yana paydo | Oldini olish |
| Har safar ish | Bir marta |
4. Amaliy
- Kontekst (domen — noyob kalit)
- Farqla (to'liq vs qism — ko'p xarid)
- Sabab (jarayon — forma/merge)
- Oldini ol (kelib chiqmasin)
5. Xulosa
- Dublikat domen bilimi (noyob kalit — ma'no)
- Qism dublikat (bir email, turli xarid — haqiqiy?)
- Ko'r-ko'rona o'chirish — ma'lumot yo'q (kontekst)
- Sabab > topish (jarayon tuzat — doimiy; ildiz sabab)
Nimani mustahkamlaydi: 2.3, 2.5-bo'limlar.
Xulosa
Bu darsda dublikatlarni o'rgandik.
Eng muhim uch fikr:
Topish va o'chirish. Topish —
df.duplicated()(har qator — takrormi; birinchi False asl, keyingilar True;.sum()soni;df[df.duplicated(keep=False)]barcha dublikat). O'chirish —df.drop_duplicates()(nusxa o'chir, birinchi qoldir;.reset_index(drop=True)indeks tuzat).Qism dublikat va keep. Qism dublikat —
subset=["email"](faqat ba'zi ustun — noyob bo'lishi kerak; email bir, lekin turli xarid — haqiqiy, dublikat emas; kontekst). keep —first(birinchi — eski; standart),last(oxirgi — yangi),False(barcha dublikatni o'chir).Statistikani buzadi. Dublikat yashirin (ko'rinmaydi) va buzadi (sanoq 100→120, o'rtacha egilgan, model ortiqcha). Jarayon: topish → farqlash (to'liq vs qism) → o'chirish →
reset_index→ tekshir. Sabab (kiritish/birlashtirish/nusxa) — oldini ol (topishdan muhimroq — doimiy). Tuzoqlar: qism ko'r-ko'rona (ko'p xarid yo'q), keep noto'g'ri (eski), reset_index unut, sabab e'tiborsiz (yana paydo), noyob emas ustun (soxta dublikat), katta-kichik harf ("Ali"vs"ali "— avval normallashtir 6.7).
Keyingi darsda outlier (chetki qiymatlar)ni o'rganamiz: g'ayrioddiy qiymatlar (juda katta/kichik — xato yoki haqiqiy) — topish (IQR, z-score — 4.3, 4.4) va hal qilish (o'chirish, cheklash, saqlash); tahlilni buzadi (o'rtacha, model).
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!