Mundarija (22)
- 1. Kirish va motivatsiya
- 2. Nazariya — chuqur tushuntirish
- 2.1. Bo'sh qiymatlar (isna, dropna, fillna)
- 2.2. Dublikatlar (drop_duplicates)
- 2.3. Turlarni tuzatish (astype, to_numeric)
- 2.4. Matn tozalash (.str)
- 2.5. Qiymat almashtirish (replace, map)
- 2.6. Ustun nomi (rename)
- 2.7. Noto'g'ri qiymatlar
- 2.8. Tozalash jarayoni
- 3. Tez ma'lumotnoma
- 4. Batafsil misollar
- Misol 1 — Bo'sh qiymatlar
- Misol 2 — Dublikatlar va turlar
- Misol 3 — Matn tozalash va almashtirish
- Misol 4 — Amaliy: to'liq tozalash quvuri
- 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.8-dars: pandas — tozalash
24-QISM — MA'LUMOT TAHLILI · 8-dars
1. Kirish va motivatsiya
24.6 da ko'rdik: real ma'lumot iflos — "garbage in, garbage out". Endi shu iflos ma'lumotni tozalash: bo'sh qiymatlar (NaN — yo'q narx), dublikatlar (bir yozuv ikki marta), noto'g'ri turlar (son matn bo'lib qolgan), nomuvofiq matn ("EN", "en", "En" — bir narsa), noto'g'ri qiymatlar (manfiy yosh). Bularsiz tahlil noto'g'ri natija beradi.
Ma'lumot tozalash — tahlilning eng ko'p vaqt oladigan qismi (ba'zan 80%). pandas tozalash vositalari: bo'sh qiymatlar (dropna, fillna), dublikatlar (drop_duplicates), turlar (astype, to_numeric), matn (.str.lower, .str.strip, replace), nom (rename). Toza ma'lumot — to'g'ri tahlilning zaruriy sharti. "Iflos ma'lumot bilan eng yaxshi model ham xato".
Real vaziyat. Bir hisobot noto'g'ri chiqdi — o'rtacha narx juda past edi. Sabab: ba'zi narxlar matn ("N/A"), ba'zi qatorlar takror, "uz"/"UZ"/"Uz" alohida hisoblangan. Tozalash qilindi: fillna (bo'sh — o'rtacha), drop_duplicates (takror), str.lower (matn birxil), to_numeric (son). Hisobot to'g'ri bo'ldi. Tozalash — ishonchli tahlilning poydevori.
Bu darsda pandas tozalashni o'rganamiz.
Bu darsda:
- Bo'sh qiymatlar (
isna,dropna,fillna) - Dublikatlar (
drop_duplicates) - Turlarni tuzatish (
astype,to_numeric) - Matn tozalash (
.str) - Qiymat almashtirish (
replace) - Ustun nomi (
rename) - Noto'g'ri qiymatlar
- Amaliy: to'liq tozalash
ℹ Misollarda pandas (
import pandas as pd) bilan sinaladi.
2. Nazariya — chuqur tushuntirish
2.1. Bo'sh qiymatlar (isna, dropna, fillna)
NaN — yo'q ma'lumot:
df.isna().sum() # har ustunda bo'sh soni
df.dropna() # bo'sh qatorlarni o'chir
df.dropna(subset=["narx"]) # faqat narx bo'sh bo'lsa
df.fillna(0) # bo'shni 0 ga
df["narx"].fillna(df["narx"].mean()) # o'rtacha bilan Bo'sh qiymatlar (NaN): .isna().sum() (birinchi qadam — qayerda, qancha bo'sh), .dropna() (bo'sh qatorlarni o'chir — subset bilan faqat ba'zi ustun), .fillna(qiymat) (to'ldir — 0, o'rtacha, oldingi qiymat). Tanlov: bo'sh kam bo'lsa o'chir (dropna), muhim bo'lsa to'ldir (fillna). Ma'lumotga qarab.
2.2. Dublikatlar (drop_duplicates)
Takrorlangan qatorlar:
df.duplicated() # takror qator (bool)
df.duplicated().sum() # takror soni
df.drop_duplicates() # takrorlarni o'chir
df.drop_duplicates(subset=["nom"], keep="first") # nom bo'yicha Dublikatlar — takrorlangan qatorlar (bir yozuv ikki marta — xato manba, birlashtirish): .duplicated() (takrormi — bool), .duplicated().sum() (soni), .drop_duplicates() (o'chir). subset (qaysi ustun bo'yicha takror), keep="first"/"last" (qaysini saqla). Takror ma'lumot — noto'g'ri sanoq/statistika. Tozalashning muhim qadami.
2.3. Turlarni tuzatish (astype, to_numeric)
Noto'g'ri tur — matn bo'lib qolgan son:
df["narx"].astype(int) # tur o'zgartirish
pd.to_numeric(df["narx"], errors="coerce") # matn → son (xato → NaN)
df["narx"].astype("Int64") # nullable int (NaN bilan)
df["sana"] = pd.to_datetime(df["sana"]) # sana Turlarni tuzatish: .astype(int) (tur o'zgartirish — 24.4), pd.to_numeric(x, errors="coerce") (matnni songa — xato qiymat → NaN, xavfsiz), pd.to_datetime (sanaga). "Int64" (bosh harf — nullable int, NaN bilan ishlaydi). Real ma'lumotda son ko'pincha matn ("100", "N/A") — to'g'ri turga o'girish kerak. errors="coerce" — xatoda to'xtamaydi.
2.4. Matn tozalash (.str)
Nomuvofiq matn:
df["til"].str.lower() # kichik harf
df["til"].str.upper() # katta harf
df["nom"].str.strip() # bo'sh joylarni olib tashla
df["nom"].str.replace(" ", "_") # almashtirish
df["til"].str.strip().str.lower() # zanjir Matn tozalash (.str — 04-qism satrlar): .str.lower()/.str.upper() (harf birxil — "EN"/"en" → "en"), .str.strip() (chet bo'sh joylar), .str.replace(a, b) (almashtirish). Zanjir bilan (.str.strip().str.lower()). Nomuvofiq matn ("uz", "UZ", "Uz") — bir narsa sifatida hisoblanmaydi — tozalash birxil qiladi.
2.5. Qiymat almashtirish (replace, map)
Qiymatlarni o'zgartirish:
df["til"].replace({"en": "english", "uz": "uzbek"}) # lug'at
df["status"].replace("kut", "kutilmoqda") # bitta
df["baho"].map({1: "past", 2: "o'rta", 3: "yuqori"}) # xarita replace — qiymatlarni almashtirish: .replace({eski: yangi}) (lug'at — ko'p qiymat), .replace(eski, yangi) (bitta). .map({...}) — har qiymatni xarita bo'yicha (kategoriyani belgiga). Bu kod (1, 2, 3) ni ma'noga ("past", "o'rta") yoki nomuvofiqni birxilga. Ma'lumotni standartlashtirish (bir xil ko'rinish).
2.6. Ustun nomi (rename)
Ustunlarni qayta nomlash:
df.rename(columns={"nom": "mahsulot", "narx": "price"})
df.columns = ["a", "b", "c"] # hammasi
df.columns = df.columns.str.lower() # kichik harf
df.columns = df.columns.str.strip() # bo'sh joy rename(columns={...}) — ustun nomlarini o'zgartirish (lug'at — eski: yangi). df.columns = [...] (hammasini). df.columns.str.lower() (barcha nom kichik). Real ma'lumotda ustun nomlari iflos ("Narx ", "NOM", bo'sh joyli) — birxil, toza nomga keltirish. O'qiluvchan va ishlashga qulay.
2.7. Noto'g'ri qiymatlar
Mantiqsiz qiymatlar:
df[df["yosh"] < 0] # noto'g'ri (manfiy yosh)
df.loc[df["yosh"] < 0, "yosh"] = None # NaN ga (keyin fillna)
df = df[df["narx"] > 0] # noto'g'rini o'chir
df["narx"] = df["narx"].clip(0, 1000) # oraliqda chekla Noto'g'ri qiymatlar — mantiqsiz (manfiy yosh, 200 baho, kelajak sana): topish (df[df.yosh < 0]), tuzatish (loc bilan NaN yoki o'chirish, clip bilan cheklash). Bu bo'sh emas, lekin xato qiymat — statistikani buzadi. Mantiqiy chegara (yosh 0–120, baho 0–100) bilan tekshir. Ma'lumot to'g'riligi (validation).
2.8. Tozalash jarayoni
Tozalash tartibi: 1) ma'lumotni tani (head, dtypes, isna, describe), 2) bo'sh qiymatlar (fillna/dropna), 3) dublikatlar (drop_duplicates), 4) turlar (to_numeric, astype), 5) matn (.str), 6) noto'g'ri qiymatlar (mantiqiy chegara), 7) ustun nomlari (rename). Har qadamdan keyin tekshir. Tozalash — takrorlanadigan (skript — 26-qism) bo'lsin (qo'lda emas). "Toza ma'lumot — to'g'ri tahlil" — poydevor.
3. Tez ma'lumotnoma
import pandas as pd
# bo'sh qiymatlar:
df.isna().sum() # tekshir
df.dropna(subset=["narx"]) # o'chir
df["narx"].fillna(df["narx"].mean()) # to'ldir
# dublikatlar:
df.duplicated().sum()
df.drop_duplicates(subset=["nom"], keep="first")
# turlar:
pd.to_numeric(df["narx"], errors="coerce")
df["sana"] = pd.to_datetime(df["sana"])
df["narx"].astype("Int64") # nullable int
# matn:
df["til"].str.strip().str.lower()
df["til"].replace({"en": "english"})
# ustun nomi:
df.rename(columns={"nom": "mahsulot"})
df.columns = df.columns.str.lower()
# noto'g'ri qiymat:
df = df[df["yosh"] > 0]
df["narx"] = df["narx"].clip(0, 1000)Tozalash xulosasi
Bo'sh: isna/dropna/fillna · dublikat: drop_duplicates
Tur: to_numeric/astype · matn: str.lower/strip · replace: almashtirish
rename: ustun nomi · noto'g'ri: mantiqiy chegara · takrorlanadigan skript4. Batafsil misollar
Misollarda pandas (
import pandas as pd) bilan sinaladi.
Misol 1 — Bo'sh qiymatlar
"""bo'sh qiymatlar: isna (tekshir), dropna (o'chir), fillna (to'ldir — 0, o'rtacha)."""
import warnings
warnings.filterwarnings("ignore")
import pandas as pd
def main() -> None:
df = pd.DataFrame({
"nom": ["Python", "Go", None, "PHP", "Ruby"],
"narx": [100, None, 150, 80, None],
})
print("=== 1. isna (bo'shni tekshir) ===")
print(f" har ustunda bo'sh: {df.isna().sum().to_dict()}")
print("\n=== 2. dropna (bo'sh qatorlarni o'chir) ===")
print(f" original qatorlar: {len(df)}")
print(f" dropna keyin: {len(df.dropna())}")
print("\n=== 3. fillna (0 bilan) ===")
print(f" narx fillna(0): {df['narx'].fillna(0).tolist()}")
print("\n=== 4. fillna (o'rtacha bilan) ===")
ortacha = df["narx"].mean()
print(f" o'rtacha: {round(ortacha, 1)}")
print(f" fillna(o'rtacha): {df['narx'].fillna(ortacha).round(1).tolist()}")
print(" ⭐ isna → dropna yoki fillna (ma'lumotga qarab)")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. isna (bo'shni tekshir) ===
har ustunda bo'sh: {'nom': 1, 'narx': 2}
=== 2. dropna (bo'sh qatorlarni o'chir) ===
original qatorlar: 5
dropna keyin: 2
=== 3. fillna (0 bilan) ===
narx fillna(0): [100.0, 0.0, 150.0, 80.0, 0.0]
=== 4. fillna (o'rtacha bilan) ===
o'rtacha: 110.0
fillna(o'rtacha): [100.0, 110.0, 150.0, 80.0, 110.0]
⭐ isna → dropna yoki fillna (ma'lumotga qarab)Nima ko'rsatdi: 2.1-bo'lim.
Misol 2 — Dublikatlar va turlar
"""dublikatlar (duplicated, drop_duplicates); turlar (to_numeric errors=coerce, astype)."""
import warnings
warnings.filterwarnings("ignore")
import pandas as pd
def main() -> None:
df = pd.DataFrame({
"nom": ["Python", "Go", "Python", "Rust", "Go"],
"narx": [100, 120, 100, 150, 120],
})
print("=== 1. Dublikatlar (duplicated) ===")
print(f" takror qatorlar soni: {df.duplicated().sum()}")
print("\n=== 2. drop_duplicates ===")
toza = df.drop_duplicates()
print(f" original: {len(df)}, tozalangan: {len(toza)}")
print("\n=== 3. subset bo'yicha (nom) ===")
nom_uniq = df.drop_duplicates(subset=["nom"], keep="first")
print(f" noyob nomlar: {nom_uniq['nom'].tolist()}")
print("\n=== 4. to_numeric (matn → son) ===")
df2 = pd.DataFrame({"narx": ["100", "200", "N/A", "150"]})
df2["narx_son"] = pd.to_numeric(df2["narx"], errors="coerce")
print(f" matn: {df2['narx'].tolist()}")
print(f" son (xato→NaN): {df2['narx_son'].tolist()}")
print(" ⭐ drop_duplicates (takror), to_numeric (tur)")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. Dublikatlar (duplicated) ===
takror qatorlar soni: 2
=== 2. drop_duplicates ===
original: 5, tozalangan: 3
=== 3. subset bo'yicha (nom) ===
noyob nomlar: ['Python', 'Go', 'Rust']
=== 4. to_numeric (matn → son) ===
matn: ['100', '200', 'N/A', '150']
son (xato→NaN): [100.0, 200.0, nan, 150.0]
⭐ drop_duplicates (takror), to_numeric (tur)Nima ko'rsatdi: 2.2, 2.3-bo'limlar.
Misol 3 — Matn tozalash va almashtirish
"""matn tozalash (str.strip, str.lower); replace (lug'at); rename (ustun nomi)."""
import warnings
warnings.filterwarnings("ignore")
import pandas as pd
def main() -> None:
df = pd.DataFrame({
"Nom ": ["Python", "Go", "Rust"],
"til": [" UZ", "en ", "En"],
})
print("=== 1. Ustun nomi tozalash (rename/strip) ===")
df.columns = df.columns.str.strip().str.lower()
print(f" ustunlar: {list(df.columns)}")
print("\n=== 2. Matn tozalash (strip + lower) ===")
df["til"] = df["til"].str.strip().str.lower()
print(f" til: {df['til'].tolist()}")
print("\n=== 3. replace (lug'at bilan) ===")
df["til_toliq"] = df["til"].replace({"uz": "uzbek", "en": "english"})
print(f" to'liq: {df['til_toliq'].tolist()}")
print("\n=== 4. rename (ustun qayta nomlash) ===")
df = df.rename(columns={"nom": "mahsulot"})
print(f" yangi ustunlar: {list(df.columns)}")
print(" ⭐ str (matn), replace (qiymat), rename (ustun) — tozalash")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. Ustun nomi tozalash (rename/strip) ===
ustunlar: ['nom', 'til']
=== 2. Matn tozalash (strip + lower) ===
til: ['uz', 'en', 'en']
=== 3. replace (lug'at bilan) ===
to'liq: ['uzbek', 'english', 'english']
=== 4. rename (ustun qayta nomlash) ===
yangi ustunlar: ['mahsulot', 'til', 'til_toliq']
⭐ str (matn), replace (qiymat), rename (ustun) — tozalashNima ko'rsatdi: 2.4, 2.5, 2.6-bo'limlar.
Misol 4 — Amaliy: to'liq tozalash quvuri
Real misol: iflos ma'lumot — bo'sh, takror, matn son, nomuvofiq til, noto'g'ri narx. To'liq tozalash. Bu — ma'lumot tozalashning namunasi.
"""to'liq tozalash: bo'sh (fillna), takror (drop_duplicates), tur (to_numeric), matn (str), noto'g'ri (filtr)."""
import warnings
warnings.filterwarnings("ignore")
import pandas as pd
def main() -> None:
# iflos ma'lumot
df = pd.DataFrame({
"mahsulot": ["Python", "Go", "Python", "Rust", "PHP"],
"narx": ["100", "120", "100", "N/A", "-50"], # matn, N/A, manfiy
"til": [" UZ", "en", " uz", "EN ", "Uz"], # nomuvofiq
})
print("=== 1. Boshlang'ich holat ===")
print(f" qatorlar: {len(df)}, ustunlar: {list(df.columns)}")
print("\n=== 2. Turlarni tuzat (narx → son) ===")
df["narx"] = pd.to_numeric(df["narx"], errors="coerce")
print(f" narx (son, xato→NaN): {df['narx'].tolist()}")
print("\n=== 3. Matn tozala (til birxil) ===")
df["til"] = df["til"].str.strip().str.lower()
print(f" til: {df['til'].tolist()}")
print("\n=== 4. Takror, bo'sh, noto'g'ri tozala ===")
df = df.drop_duplicates(subset=["mahsulot"], keep="first") # takror
df = df[df["narx"] > 0] # noto'g'ri/bo'sh (NaN>0 False)
print(f" yakuniy qatorlar: {len(df)}")
print(f" toza mahsulotlar: {df['mahsulot'].tolist()}")
print(f" o'rtacha narx: {round(df['narx'].mean(), 1)}")
print(" ⭐ tur → matn → takror → noto'g'ri — to'liq tozalash")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. Boshlang'ich holat ===
qatorlar: 5, ustunlar: ['mahsulot', 'narx', 'til']
=== 2. Turlarni tuzat (narx → son) ===
narx (son, xato→NaN): [100.0, 120.0, 100.0, nan, -50.0]
=== 3. Matn tozala (til birxil) ===
til: ['uz', 'en', 'uz', 'en', 'uz']
=== 4. Takror, bo'sh, noto'g'ri tozala ===
yakuniy qatorlar: 2
toza mahsulotlar: ['Python', 'Go']
o'rtacha narx: 110.0
⭐ tur → matn → takror → noto'g'ri — to'liq tozalashNima ko'rsatdi: 2.1–2.8-bo'limlar.
5. To'g'ri va noto'g'ri tushunishlar
| Noto'g'ri fikr | To'g'risi |
|---|---|
| "Ma'lumot toza" | Real ma'lumot iflos (tekshir) |
| "Bo'sh — doim o'chir" | Ma'lumotga qarab (fillna ham) |
"astype(int) NaN bilan" |
to_numeric/Int64 (nullable) |
| "Takror muammo emas" | Statistikani buzadi |
| "'UZ' = 'uz'" | Yo'q (str.lower kerak) |
| "Bo'sh = noto'g'ri" | Bo'sh (NaN) ≠ xato qiymat |
| "Tozalash bir marta" | Takrorlanadigan skript |
| "Turlar to'g'ri" | Tekshir (son matn bo'lishi mumkin) |
6. Keng tarqalgan xatolar va yechimlari
1. Bo'sh qiymatlarni tekshirmaslik
df["narx"].mean() # NaN aralash # ⚠️
df["narx"].isna().sum() # avval tekshir # ✅2. astype(int) NaN bilan
df["narx"].astype(int) # NaN — xato # ⚠️
pd.to_numeric(df["narx"], errors="coerce") # ✅3. Matnni birxil qilmaslik
df["til"].value_counts() # UZ, uz, Uz alohida # ⚠️
df["til"].str.lower().value_counts() # ✅4. errors="coerce"siz to_numeric
pd.to_numeric(df["x"]) # xato qiymatda to'xtaydi # ⚠️
pd.to_numeric(df["x"], errors="coerce") # ✅5. Takror ustunda subsetsiz
df.drop_duplicates() # butun qator bir xil bo'lsa # ba'zan kerak
df.drop_duplicates(subset=["id"]) # id bo'yicha # ✅6. Noto'g'ri qiymatni sezmaslik
df["yosh"].mean() # manfiy yosh aralash # ⚠️
df = df[df["yosh"] > 0] # avval filtrla # ✅7. Tozalashni asl'ga saqlamaslik
df.dropna() # yangi (asl o'zgarmaydi) # ⚠️
df = df.dropna() # yoki inplace # ✅7. Integratsiya — bu bilim qayerda kerak bo'ladi
- 24.6-dars (o'tilgan): O'qish — iflos ma'lumot manbai
- 24.7-dars (o'tilgan): Filtr — noto'g'ri qiymatlar
- 24.9-dars: Guruhlash — toza ma'lumot
- 25-qism: ML — ma'lumot tayyorlash (tozalash)
- 26-qism: Avtomatlashtirish — tozalash skripti
8. Eng yaxshi amaliyotlar
Avval tani (
isna,dtypes,describe).Bo'sh — ma'lumotga qarab (
dropna/fillna).to_numeric(errors="coerce")— matn son.Takror —
drop_duplicates(subset).Matn —
.str.strip().str.lower()(birxil).Noto'g'ri qiymat — mantiqiy chegara.
Ustun nomi — toza (
rename,str.lower).Tozalash — takrorlanadigan skript.
9. Amaliy topshiriq
Vazifa 1: Bashorat qiling
1. # isna nima?
2. # dropna nima?
3. # fillna nima?
4. # drop_duplicates nima?
5. # to_numeric errors=coerce?
6. # astype vs to_numeric?
7. # str.lower nima?
8. # replace nima?
9. # rename nima?
10. # noto'g'ri qiymat vs bo'sh?
11. # Int64 nima?
12. # tozalash tartibi?Javoblar
- Qayerda bo'sh (tekshirish)
- Bo'sh qatorlarni o'chirish
- Bo'shni to'ldirish
- Takror qatorlarni o'chirish
- Matn → son (xato → NaN)
- astype qat'iy, to_numeric xavfsiz (coerce)
- Matn kichik harf
- Qiymat almashtirish
- Ustun qayta nomlash
- Bo'sh — yo'q, noto'g'ri — xato qiymat
- Nullable int (NaN bilan)
- Tani → bo'sh → takror → tur → matn → noto'g'ri
Vazifa 2: Xatolarni tuzating
1. df["narx"].astype(int) # NaN bor # to_numeric
2. df["til"].value_counts() # UZ, uz # str.lower
3. pd.to_numeric(df["x"]) # xato qiymat # errors=coerce
4. df.dropna() # asl o'zgarmaydi # df = ...
5. df["yosh"].mean() # manfiy aralash # filtrJavoblar
1. pd.to_numeric(df["narx"], errors="coerce")
2. df["til"].str.lower().value_counts()
3. pd.to_numeric(df["x"], errors="coerce")
4. df = df.dropna()
5. df[df["yosh"] > 0]["yosh"].mean()Vazifa 3: Bo'sh qiymatlar
Tozalash:
isnatekshirdropnafillna(0)fillna(o'rtacha)
Vazifa 4: Dublikat va tur
Tozalash:
duplicateddrop_duplicatesto_numericastype
Vazifa 5: Matn
Tozalash:
str.stripstr.lowerreplacerename
Vazifa 6: To'liq
Quvur:
- Iflos ma'lumot
- Turlar
- Bo'sh, takror
- Noto'g'ri
Vazifa 7: O'ylash
Ma'lumot tozalash — tahlilning eng ko'p vaqt oladigan qismi (ba'zan 80%). Bo'sh qiymat (NaN — yo'q) va noto'g'ri qiymat (manfiy yosh — xato) farq qiladi. Nima uchun "tozalash — tahlilning asosiy qismi", va nega uni takrorlanadigan (skript, qo'lda emas) qilish muhim — "toza ma'lumot, to'g'ri natija" tamoyili bilan qanday bog'liq?
Javob
Qisqa javob: Tozalash tahlilning 80% vaqtini oladi, chunki real ma'lumot iflos (bo'sh, takror, xato, nomuvofiq) va toza ma'lumotsiz tahlil noto'g'ri ("garbage in, garbage out", 24.6). Bo'sh (NaN — ma'lumot yo'q) va noto'g'ri (manfiy yosh — ma'lumot xato) farq: bo'shni to'ldirish/o'chirish, xatoni tuzatish/o'chirish. Tozalash takrorlanadigan (skript) bo'lsin, chunki: ma'lumot yangilanadi (har oy yangi CSV — qo'lda tozalash takror mehnat), hujjatlangan (skript — nima qilindi, ko'rinadi), xatosiz (qo'lda tozalash — inson xatosi), tekshiriladigan (test — 17-qism). "Toza ma'lumot — to'g'ri natija" — poydevor; skript bilan ishonchli va takrorlanadigan.
1. Nega 80% tozalash
Real ma'lumot iflos (odam kiritgan, turli tizim). Toza ma'lumotsiz — noto'g'ri tahlil. Tozalash — poydevor (uy poydevori kabi).
2. Bo'sh vs noto'g'ri
| Bo'sh (NaN) | Noto'g'ri |
|---|---|
| Ma'lumot yo'q | Ma'lumot xato |
isna |
Mantiqiy chegara |
| dropna/fillna | Tuzat/o'chir/clip |
| Bilamiz yo'qligini | Sezish kerak |
3. Nega takrorlanadigan skript
| Qo'lda | Skript |
|---|---|
| Har safar takror | Bir marta yoz, qayta ishlat |
| Xato (inson) | Ishonchli |
| Hujjatsiz | Kod — hujjat |
| Yangi ma'lumot — qayta | Avtomatik |
Ma'lumot yangilanadi (har oy) — skript qayta ishlaydi. Qo'lda — takror mehnat va xato.
4. "Toza ma'lumot, to'g'ri natija"
Iflos → xato natija (garbage in, garbage out). Toza → ishonchli tahlil. Tozalash — tahlilning zaruriy sharti (bezak emas).
5. Muhandislik saboqlari
- Tozalash — tahlilning asosi (80%)
- Bo'sh (yo'q) ≠ noto'g'ri (xato)
- Takrorlanadigan skript (qo'lda emas)
- Toza ma'lumot — to'g'ri natija (poydevor)
6. Xulosa
- Tozalash — vaqt oladi, lekin zaruriy
- Bo'sh va noto'g'ri — har xil
- Skript (takrorlanadigan, hujjatlangan)
- Ma'lumot sifati — natija sifati
Nimani mustahkamlaydi: 2.1–2.8-bo'limlar.
Xulosa
Bu darsda pandas tozalashni o'rgandik.
Eng muhim uch fikr:
Bo'sh qiymatlar va dublikatlar. Bo'sh qiymatlar (NaN):
.isna().sum()(birinchi qadam — qayerda, qancha),.dropna()(o'chir —subsetbilan ba'zi ustun),.fillna(qiymat)(to'ldir — 0, o'rtacha). Tanlov ma'lumotga qarab (kam bo'lsa o'chir, muhim bo'lsa to'ldir). Dublikatlar (takror qatorlar):.duplicated().sum()(soni),.drop_duplicates(subset=[...], keep="first")(o'chir). Takror — noto'g'ri sanoq/statistika.Turlar va matn tozalash. Turlarni tuzatish:
pd.to_numeric(x, errors="coerce")(matnni songa — xato → NaN, xavfsiz),pd.to_datetime(sanaga),.astype("Int64")(nullable int — NaN bilan).errors="coerce"muhim (xatoda to'xtamaydi). Matn tozalash (.str):.str.lower()/.str.strip()(birxil — "EN"/"en" → "en"),.str.replace. Qiymat:.replace({eski: yangi})(almashtirish),.map({...})(xarita). Ustun nomi:.rename(columns={...}),df.columns.str.lower().Noto'g'ri qiymatlar va jarayon. Noto'g'ri qiymatlar — mantiqsiz (manfiy yosh, 200 baho): topish (
df[df.yosh < 0]), tuzatish (locNaN, o'chirish,clip). Bo'sh (NaN — yo'q) va noto'g'ri (xato qiymat) farq qiladi. Tozalash tartibi: tani → bo'sh → dublikat → tur → matn → noto'g'ri → ustun nomi. Tozalash — tahlilning eng ko'p vaqt oladigan qismi (80%), takrorlanadigan skript bo'lsin (ma'lumot yangilanadi, hujjatlangan, xatosiz). "Toza ma'lumot — to'g'ri natija" — ishonchli tahlilning poydevori ("garbage in, garbage out", 24.6).
Keyingi darsda pandas: guruhlash ni o'rganamiz: groupby bilan ma'lumotni toifalab jamlash (har kategoriya bo'yicha jami, o'rtacha) — tahlilning eng kuchli vositalaridan.
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!