Real data me values gayab hona bahut aam hai — form me kisi ne field khali chhod di, sensor band ho gaya, ya system me error aa gaya. Pandas me missing value NaN (Not a Number) ya None dikhti hai. Zyadatar ML models missing values ke saath chal hi nahi paate, isliye inhe handle karna zaroori hai.
Setup
import numpy as np
import pandas as pd
students = pd.DataFrame({
"name": ["Aman", "Riya", "Kabir", "Sara", "Dev", "Isha"],
"age": [21, np.nan, 23, 22, np.nan, 24],
"city": ["Delhi", "Mumbai", None, "Delhi", "Pune", None],
"marks": [78, 85, np.nan, 91, 66, 72],
})
print(students)
Output
name age city marks
0 Aman 21.0 Delhi 78.0
1 Riya NaN Mumbai 85.0
2 Kabir 23.0 None NaN
3 Sara 22.0 Delhi 91.0
4 Dev NaN Pune 66.0
5 Isha 24.0 None 72.0
Missing values dhoondhna
Example
print(students.isnull().sum())
print()
print("Missing %:")
print((students.isnull().mean() * 100).round(1))
Output
name 0
age 2
city 2
marks 1
dtype: int64
Missing %:
name 0.0
age 33.3
city 33.3
marks 16.7
dtype: float64
Option 1: dropna() — rows hata dena
Example
print(students.dropna()) # jis row me koi bhi NaN, wo gayi
print()
print(students.dropna(subset=["marks"])) # sirf marks missing ho to hatao
print()
print(students.dropna(thresh=3)) # kam se kam 3 values honi chahiye
Output
name age city marks
0 Aman 21.0 Delhi 78.0
3 Sara 22.0 Delhi 91.0
name age city marks
0 Aman 21.0 Delhi 78.0
1 Riya NaN Mumbai 85.0
3 Sara 22.0 Delhi 91.0
4 Dev NaN Pune 66.0
5 Isha 24.0 None 72.0
name age city marks
0 Aman 21.0 Delhi 78.0
1 Riya NaN Mumbai 85.0
3 Sara 22.0 Delhi 91.0
4 Dev NaN Pune 66.0
5 Isha 24.0 None 72.0
Dhyan dijiye — pehle command ne 6 me se sirf 2 rows chhodi! Rows hataane se kaafi data kho sakta hai, isliye ye tabhi kariye jab missing rows bahut kam hon.
Option 2: fillna() — value bhar dena
Numbers ke liye mean ya median, aur text ke liye mode (sabse common value) ya "Unknown":
Example
filled = students.copy()
filled["age"] = filled["age"].fillna(filled["age"].median())
filled["marks"] = filled["marks"].fillna(filled["marks"].mean())
filled["city"] = filled["city"].fillna(filled["city"].mode()[0])
print(filled)
Output
name age city marks
0 Aman 21.0 Delhi 78.0
1 Riya 22.5 Mumbai 85.0
2 Kabir 23.0 Delhi 78.4
3 Sara 22.0 Delhi 91.0
4 Dev 22.5 Pune 66.0
5 Isha 24.0 Delhi 72.0
Ek saath kai columns ke liye dictionary de sakte hain:
Example
print(students.fillna({"age": 22, "city": "Unknown", "marks": 0}))
Output
name age city marks
0 Aman 21.0 Delhi 78.0
1 Riya 22.0 Mumbai 85.0
2 Kabir 23.0 Unknown 0.0
3 Sara 22.0 Delhi 91.0
4 Dev 22.0 Pune 66.0
5 Isha 24.0 Unknown 72.0
Time series: ffill aur interpolate
Roz ke temperature jaise data me pichhli value aage le jaana (ffill) ya beech ki value andaaza lagana (interpolate) zyada sahi hota hai:
Example
temps = pd.Series([30, np.nan, np.nan, 33, 34],
index=pd.date_range("2026-06-01", periods=5))
print(pd.DataFrame({
"original": temps,
"ffill": temps.ffill(),
"interpolate": temps.interpolate(),
}))
Output
original ffill interpolate
2026-06-01 30.0 30.0 30.0
2026-06-02 NaN 30.0 31.0
2026-06-03 NaN 30.0 32.0
2026-06-04 33.0 33.0 33.0
2026-06-05 34.0 34.0 34.0
Group ke hisaab se fill karna
Poore data ka average hamesha sahi nahi. IT wale ki missing salary ko HR ke average se bharna galat hoga. groupby().transform() se har group ka apna median lagaiye:
Example
emp = pd.DataFrame({
"dept": ["IT", "IT", "IT", "HR", "HR", "HR"],
"salary": [80000, np.nan, 90000, 40000, 42000, np.nan],
})
emp["salary_filled"] = emp["salary"].fillna(emp.groupby("dept")["salary"].transform("median"))
print(emp)
Output
dept salary salary_filled
0 IT 80000.0 80000.0
1 IT NaN 85000.0
2 IT 90000.0 90000.0
3 HR 40000.0 40000.0
4 HR 42000.0 42000.0
5 HR NaN 41000.0
scikit-learn ka SimpleImputer
ML pipelines me SimpleImputer use hota hai — ye training data se value seekhta hai aur wahi value naye data pe lagata hai:
Example
from sklearn.impute import SimpleImputer
imputer = SimpleImputer(strategy="median")
result = imputer.fit_transform(students[["age", "marks"]])
print(result)
print("Seekhi hui medians:", imputer.statistics_)
Output
[[21. 78. ]
[22.5 85. ]
[23. 78. ]
[22. 91. ]
[22.5 66. ]
[24. 72. ]]
Seekhi hui medians: [22.5 78. ]
Kab kaunsa tareeka?
Situation | Tareeka |
|---|---|
Bahut kam rows missing (< 5%) |
|
Number column, outliers nahi | Mean se fill |
Number column, outliers hain | Median se fill (outliers ka asar nahi) |
Category / text column | Mode ya "Unknown" |
Time series |
|
Groups me alag pattern |
|
Column me 60-70%+ missing | Column hi drop karne pe vichaar kariye |
Kabhi-kabhi missing hona khud ek information hai — jaise loan form me income na bharna. Aise me fill karne se pehle ek naya column
income_missing = df["income"].isnull()bana lena accha idea hai.