Free tutorials & notes in Hindi & English · Clean code examples 🧰 मुफ़्त PDF और फ़ोटो टूल्स →
🔢 Week 2 – NumPy और Pandas  ·  दिन 14

दिन 14: Merge, Join और Concat

⏱ 90 min📶 Intermediate🎯 100% self-study
दिन 14 / 60

✅ आज आप सीखेंगे

  • असली data कई tables में क्यों होता है
  • merge: inner, left, right, outer
  • अलग key names, indicator और validate
  • concat: monthly files एक के नीचे एक
  • Duplicate rows के धमाके से बचना

🏢 असली दुनिया में

HR employees को एक system में और departments को दूसरे में रखता है; finance हर महीने salaries नई file में भेजता है। “हर department और शहर की औसत salary” बताने के लिए इन tables को सही से join और stack करना होता है – ग़लत join चुपचाप आपके numbers दोगुने कर देता है।

हमारी दो tables

Python
import pandas as pd
emp = pd.read_csv("employees.csv")
dept = pd.read_csv("departments.csv")
print(emp.head(6))
print(dept)
print("Employee dept_ids:", sorted(emp["dept_id"].unique()))
emp_id name dept_id salary join_date city 0 101 Aarav 40 61000 2020-01-05 Delhi 1 102 Diya 20 89000 2019-12-31 Bengaluru 2 103 Kabir 20 118000 2016-10-18 Pune 3 104 Ananya 10 49000 2019-03-17 Pune 4 105 Vihaan 10 78000 2021-12-25 Hyderabad 5 106 Isha 10 61000 2022-07-24 Pune dept_id dept_name location 0 10 Sales Mumbai 1 20 Data Science Bengaluru 2 30 HR Delhi 3 40 Finance Mumbai 4 50 Marketing Pune Employee dept_ids: [np.int64(10), np.int64(20), np.int64(30), np.int64(40), np.int64(50), np.int64(60)]

Join के प्रकार

empdept
inner – सिर्फ़ matches
empdept
left – सभी employees
empdept
outer – सब कुछ
how=क्या रखता हैआम इस्तेमाल
innerदोनों में match वाली rowsMatched records का साफ़ analysis
leftLeft table की सभी rowsMain table में details जोड़ना (सबसे आम)
rightRight table की सभी rowsकम – tables बदलकर left लें
outerदोनों से सब कुछकिसी भी तरफ़ क्या missing है, ढूँढना

merge का इस्तेमाल

Python
import pandas as pd
emp = pd.read_csv("employees.csv")
dept = pd.read_csv("departments.csv")
inner = emp.merge(dept, on="dept_id", how="inner")
left = emp.merge(dept, on="dept_id", how="left")
outer = emp.merge(dept, on="dept_id", how="outer", indicator=True)
print("emp:", len(emp), "| inner:", len(inner), "| left:", len(left), "| outer:", len(outer))
print(left[left["dept_name"].isna()][["emp_id", "name", "dept_id"]])
print(outer["_merge"].value_counts())
emp: 30 | inner: 28 | left: 30 | outer: 30 emp_id name dept_id 28 129 Nikhil 60 29 130 Priya 60 _merge both 28 left_only 2 right_only 0 Name: count, dtype: int64
🔎 indicator ने क्या बताया

दो employees department 60 के हैं, जो departments table में है ही नहीं। Inner join उन्हें चुपचाप हटा देता – report से पहले हमेशा unmatched rows जाँचें।

Python
import pandas as pd
emp = pd.read_csv("employees.csv")
dept = pd.read_csv("departments.csv")
full = emp.merge(dept, on="dept_id", how="left", suffixes=("_emp", "_dept"))
full["dept_name"] = full["dept_name"].fillna("Unassigned")
report = full.groupby("dept_name").agg(people=("emp_id", "count"), avg_salary=("salary", "mean")).round(0)
print(report.sort_values("avg_salary", ascending=False))
print(full[["name", "city", "location"]].head(3))      # city = where the person lives
people avg_salary dept_name Data Science 11 105818.0 Marketing 1 79000.0 Unassigned 2 71500.0 Finance 1 61000.0 Sales 10 57500.0 HR 5 52800.0 name city location 0 Aarav Delhi Mumbai 1 Diya Bengaluru Bengaluru 2 Kabir Pune Bengaluru

अलग key names और validation

Python
import pandas as pd
orders = pd.DataFrame({"order_id": [1, 2, 3, 4], "cust": ["C1", "C2", "C1", "C9"], "amount": [450, 1299, 780, 320]})
customers = pd.DataFrame({"customer_id": ["C1", "C2", "C3"], "name": ["Riya", "Om", "Zoya"], "city": ["Pune", "Delhi", "Agra"]})
m = orders.merge(customers, left_on="cust", right_on="customer_id", how="left", validate="many_to_one")
print(m)
order_id cust amount customer_id name city 0 1 C1 450 C1 Riya Pune 1 2 C2 1299 C2 Om Delhi 2 3 C1 780 C1 Riya Pune 3 4 C9 320 NaN NaN NaN
Python
import pandas as pd
orders = pd.DataFrame({"cust": ["C1", "C2"], "amount": [450, 1299]})
dirty_customers = pd.DataFrame({"cust": ["C1", "C1", "C2"], "city": ["Pune", "Pune", "Delhi"]})   # C1 duplicated!
bad = orders.merge(dirty_customers, on="cust")
print("Orders:", len(orders), "-> after merge:", len(bad), "| total amount doubled to", bad["amount"].sum())
try:
    orders.merge(dirty_customers, on="cust", validate="many_to_one")
except Exception as e:
    print("validate caught it:", type(e).__name__)
Orders: 2 -> after merge: 3 | total amount doubled to 2199 validate caught it: MergeError
⚠️ Duplicate-key का जाल

Lookup table में duplicate keys हों तो merge rows को गुणा कर देता है और totals चुपचाप बढ़ जाते हैं। validate="many_to_one" लिखें, या पहले lookup table पर drop_duplicates("key"), और merge से पहले-बाद row counts मिलाएँ।

concat: files एक के नीचे एक

Python
import pandas as pd
sales = pd.read_csv("sales_data.csv")
for m in ["01", "02", "03"]:                                   # pretend finance sent 3 monthly files
    sales[sales["order_date"].str[5:7] == m].to_csv(f"sales_2024_{m}.csv", index=False)
files = [f"sales_2024_{m}.csv" for m in ["01", "02", "03"]]
q1 = pd.concat([pd.read_csv(f).assign(source=f) for f in files], ignore_index=True)
print(q1.shape)
print(q1["source"].value_counts().sort_index())
(463, 14) source sales_2024_01.csv 166 sales_2024_02.csv 128 sales_2024_03.csv 169 Name: count, dtype: int64
Python
import pandas as pd
a = pd.DataFrame({"maths": [78, 92]}, index=["Aman", "Priya"])
b = pd.DataFrame({"science": [82, 88]}, index=["Aman", "Priya"])
print(pd.concat([a, b], axis=1))            # side by side on the index
print(a.join(b))                            # same thing with join
maths science Aman 78 82 Priya 92 88 maths science Aman 78 82 Priya 92 88

असली example: location के हिसाब से salary report

Python
import pandas as pd
emp = pd.read_csv("employees.csv")
dept = pd.read_csv("departments.csv")
before = len(emp)
df = emp.merge(dept, on="dept_id", how="left", validate="many_to_one")
assert len(df) == before, "row count changed – check keys!"
df["dept_name"] = df["dept_name"].fillna("Unassigned")
pv = df.pivot_table(index="dept_name", columns="location", values="salary", aggfunc="mean").round(-3)
print(pv.fillna("-"))
print("\nHighest paid per department:")
print(df.loc[df.groupby("dept_name")["salary"].idxmax(), ["dept_name", "name", "salary"]].to_string(index=False))
location Bengaluru Delhi Mumbai Pune dept_name Data Science 106000.0 - - - Finance - - 61000.0 - HR - 53000.0 - - Marketing - - - 79000.0 Sales - - 58000.0 - Highest paid per department: dept_name name salary Data Science Kunal 146000 Finance Aarav 61000 HR Zoya 62000 Marketing Rohan 79000 Sales Vihaan 78000 Unassigned Nikhil 80000

🏅 आज के Job Skills

✔ सही join type चुनना✔ indicator से unmatched rows ढूँढना✔ validate से totals बचाना✔ concat से files stack करना

Practice tasks

🏋️ Practice – ख़ुद करें

Task 1: Indicator वाले outer merge से वे departments ढूँढें जिनमें कोई employee नहीं।
Solution देखें
Python
import pandas as pd
emp = pd.read_csv("employees.csv"); dept = pd.read_csv("departments.csv")
m = dept.merge(emp, on="dept_id", how="left", indicator=True)
print(m[m["_merge"] == "left_only"]["dept_name"].tolist() or "Every department has employees")
Every department has employees
Task 2: हर employee के साथ department name जोड़ें और अपने department average से ज़्यादा कमाने वालों की list बनाएँ।
Solution देखें
Python
import pandas as pd
emp = pd.read_csv("employees.csv"); dept = pd.read_csv("departments.csv")
df = emp.merge(dept, on="dept_id", how="inner")
df["dept_avg"] = df.groupby("dept_name")["salary"].transform("mean")
print(df[df["salary"] > df["dept_avg"]][["name", "dept_name", "salary"]].to_string(index=False))
name dept_name salary Kabir Data Science 118000 Vihaan Sales 78000 Isha Sales 61000 Meera Data Science 115000 Kunal Data Science 146000 Pooja Sales 65000 Neha Data Science 122000 Yash Sales 74000 Tanvi Data Science 135000 Manav Data Science 111000 Zoya HR 62000 Harsh HR 57000
Task 3: students_performance.csv को Government और Private files में बाँटें, फिर concat करके row count जाँचें।

Quick quiz

🧠 Quick Quiz – ख़ुद को जाँचें

1. कौन सा join left table की हर row रखता है?
Unmatched rows के right-side columns में NaN आता है।
2. indicator=True कौन सा column जोड़ता है?
Values: left_only, right_only, both।
3. Merge के बाद total sales दोगुनी हो गईं। संभावित कारण?
हर order दो lookup rows से match हुआ।
4. Columns के नाम अलग हैं: emp.dept vs dept.dept_id। क्या लिखें?
left_on/right_on अलग नामों को जोड़ते हैं।
5. pd.concat([jan, feb]) default में…
axis=0 stack; axis=1 साथ-साथ।

Interview corner

💼 Interview Corner

कैसे जाँचेंगे कि join ने duplicates नहीं बनाए?

पहले और बाद की row count मिलाएँ (many-to-one left join में left table के बराबर होनी चाहिए), validate="many_to_one" लगाएँ, और df.key.is_unique या duplicated() से lookup key unique जाँचें।

merge और concat में क्या फ़र्क है?

merge key values मिलाकर tables को साथ-साथ जोड़ता है (SQL JOIN जैसा)। concat tables को एक axis पर stack करता है – आमतौर पर एक जैसे columns वाली rows, SQL UNION ALL जैसा।

सारांश

  • merge(on=..., how=inner/left/right/outer) SQL जैसा join करता है।
  • indicator=True unmatched rows दिखाता है।
  • validate="many_to_one" और row-count checks आपके totals बचाते हैं।
  • concat files stack करता है; join/concat(axis=1) index पर जोड़ते हैं।
➡️ आगे

Week 3 शुरू! Day 15: data cleaning – missing values, duplicates, ग़लत types और असंभव values।

अक्सर पूछे जाने वाले प्रश्न (FAQ)

merge या join?
join index पर merge का shortcut है। merge ज़्यादा general है और ज़्यादातर वही इस्तेमाल होता है।
city_x और city_y जैसे columns क्यों दिखते हैं?
दोनों tables में city नाम का column था। Merge से पहले एक का नाम बदलें या suffixes=("_emp", "_dept") दें।
← Data Science (60 Days)
🔗

Share this topic with a friend

यह topic किसी दोस्त को भेजें

Found it useful? Send it to a classmate learning the same thing.

अच्छा लगा? जो दोस्त यही सीख रहा है, उसे भेज दीजिए।

अगला topicदिन 15: Data Cleaning: Missing, Duplicates, Types आपकी प्रगति: 14 / 60 (23%) · Lesson 15 / 60 आगे बढ़ें →

यह lesson कैसा लगा?

आपकी राय से हम content और बेहतर बनाते हैं।

अपना review और सुझाव लिखें (वैकल्पिक)

Review approve होने के बाद आपका नाम और शहर इसके साथ public दिख सकते हैं। Email या phone न लिखें।

▶ CodingEasily on YouTube

Video से सीखें – आसान Hindi में

चुनी हुई video: RDBMS भाग 3 – Class XI Commerce IT

▶ Channel subscribe करें