IlmHamroh
Data Science va sun'iy intellekt/Malumotni tozalash2/12-dars17 daqiqa
Mundarija (22)

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:

python
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:

python
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

python
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 · sabab

Dublikatlar 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)

python
"""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:

text
=== 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)

python
"""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:

text
=== 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)

python
"""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:

text
=== 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)

python
"""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:

text
=== 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

python
df.drop_duplicates(subset=["email"])   # ko'p xarid yo'q          # ⚠️
df.drop_duplicates()   # to'liq (ko'p xarid saqlanadi)            # ✅

2. keep noto'g'ri

python
df.drop_duplicates(keep="first")   # eski saqlanadi               # ⚠️
df.drop_duplicates(keep="last")   # yangi (kerak bo'lsa)         # ✅

3. reset_index unutish

python
df.drop_duplicates()   # indeks: 0, 1, 3, 5 (bo'shliq)            # ⚠️
df.drop_duplicates().reset_index(drop=True)   # 0, 1, 2          # ✅

4. Sabab e'tiborsiz

python
df.drop_duplicates()   # yana paydo bo'ladi (jarayon)             # ⚠️
# forma validatsiya / merge kalit tekshir                        # ✅

5. Statistika oldin tozalash

python
df["x"].mean()   # dublikat bilan (egilgan)                       # ⚠️
df.drop_duplicates()["x"].mean()   # tozalab                     # ✅

6. Noyob emas ustun

python
df.drop_duplicates(subset=["shahar"])   # ko'p qator o'chir       # ⚠️
df.drop_duplicates(subset=["email"])   # noyob                   # ✅

7. Katta-kichik harf

python
# "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

  1. Topish — df.duplicated().sum().

  2. Ko'rish — keep=False (barcha).

  3. Qism — subset (noyob ustun).

  4. Farqla — to'liq vs qism (ko'p xarid).

  5. keep — first/last (kontekst).

  6. reset_index — indeks tuzat.

  7. Sabab — jarayon tuzat (yana paydo).

  8. Normallashtir — avval 6.7-bob, keyin dublikat.


9. Amaliy topshiriq

Vazifa 1: Bashorat qiling

python
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
  1. Takrorlangan qator
  2. Takrormi? (True/False)
  3. Yo'q (birinchi False, nusxa True)
  4. Dublikat o'chir (birinchi qoldir)
  5. Ba'zi ustun (noyob)
  6. Birinchi (eski) qoldir
  7. Oxirgi (yangi) qoldir
  8. Hammasini o'chir
  9. Yo'q (ko'p xarid bo'lishi mumkin)
  10. Indeks bo'shliq (tuzat)
  11. Kiritish/birlashtirish/nusxa
  12. Sanoq, o'rtacha egiladi

Vazifa 2: Xatolarni tuzating

python
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
python
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:

  1. duplicated
  2. sum
  3. keep=False
  4. Ko'rish

Vazifa 4: O'chirish

Modellang:

  1. drop_duplicates
  2. Birinchi qoldir
  3. reset_index
  4. Statistika tuzat

Vazifa 5: Qism va keep

Modellang:

  1. subset
  2. Noyob ustun
  3. keep first/last
  4. Kontekst

Vazifa 6: Integratsiya

Modellang:

  1. Merge (3.9)
  2. Matn (6.7)
  3. Quvur (6.11)
  4. 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

  1. Kontekst (domen — noyob kalit)
  2. Farqla (to'liq vs qism — ko'p xarid)
  3. Sabab (jarayon — forma/merge)
  4. Oldini ol (kelib chiqmasin)

5. Xulosa

  1. Dublikat domen bilimi (noyob kalit — ma'no)
  2. Qism dublikat (bir email, turli xarid — haqiqiy?)
  3. Ko'r-ko'rona o'chirish — ma'lumot yo'q (kontekst)
  4. 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:

  1. 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).

  2. 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).

  3. 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).

Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
6.2-dars: Dublikatlar — IlmHamroh