মূল content-এ যাও

Python for AI/Pandas/Lesson 48

Merge ও Join

দুটো table মেলানো — merge আর key, inner বনাম left join, মিল না পাওয়া row খোঁজা (indicator), validate দিয়ে duplicate ধরা, আর concat দিয়ে table জোড়া।

সময়
24 মিনিট
Exercise
1
Challenge
1
Quiz
3 প্রশ্ন

সহজ ভাষায়

Real data প্রায় কখনো এক table-এ থাকে না। একটা online shop-এর database:

orders                              customers
order_id  customer_id  amount       customer_id  name    city
101       1            1200         1            Rafi    Dhaka
102       2            800          2            Mim     Sylhet
103       1            450          3            Tanvir  Khulna

"কোন শহর থেকে বেশি order আসে?" — উত্তর দিতে দুটো table মেলাতে হবে, customer_id দিয়ে।

main.py

কেন দরকার?

  • Database-এর data আলাদা table-এ (normalization) — analysis-এর জন্য জোড়া লাগাতে হয়
  • ML feature: user-এর তথ্য, তার order history, product-এর তথ্য — সব এক জায়গায়
  • আলাদা source মেলানো: survey data + census data, sales + weather

Join-এর ধরন

main.py
left keys:  A B C          right keys:  B C D

inner  ->  B C              (দুটোতেই আছে)
left   ->  A B C            (বামের সব; A-এর right_val = NaN)
right  ->  B C D            (ডানের সব)
outer  ->  A B C D          (সব)
howকখন
"inner" (default)শুধু সম্পূর্ণ তথ্যওয়ালা row চাই
"left"মূল table-এর একটা row-ও হারাতে চাই না — সবচেয়ে বেশি ব্যবহৃত
"outer"দুই দিকে কী কী মেলেনি সেটা দেখতে

মিল না পাওয়া row খোঁজা: indicator

main.py

left_only — order আছে কিন্তু customer নেই (data-তে সমস্যা!)। right_only — customer আছে কিন্তু কখনো order করেননি (marketing-এর সুযোগ)।

সাবধান: duplicate key

main.py

Customer 1-এর দুটো address, তাই তার order দুবার — মোট বিক্রি ভুল! validate দিয়ে আগেই ধরো:

main.py

MergeError — "ডান দিকে প্রতিটা key একবারই থাকার কথা"। Production code-এ merge-এ validate দেওয়া ভালো অভ্যাস।

concat: উপর-নিচে জোড়া

main.py

প্রতি মাসের আলাদা CSV file থেকে পুরো বছরের data বানাতে: pd.concat([pd.read_csv(f) for f in files])।

Exercise

Exercise

Order-এর সাথে customer-এর শহর

+20 XP

orders আর customers দুটো আলাদা table, customer_id দিয়ে সম্পর্কিত।

result = প্রতিটা order-এর সাথে customer-এর name আর city যোগ করা DataFrame। সব order থাকবে — কোনো customer-এর তথ্য না পেলেও (তখন name/city missing)।

solution.py

Quiz

  1. Q1how="inner" merge-এ কোন row থাকে?
  2. Q2Merge-এর পর row সংখ্যা মূলের চেয়ে বেড়ে গেল। সবচেয়ে সম্ভাব্য কারণ?
  3. Q3দুটো একই column-এর DataFrame (জানুয়ারি আর ফেব্রুয়ারির data) উপর-নিচে জোড়া দিতে?
0/3 answered

Challenge

Challenge

শহর অনুযায়ী আয় — শূন্য সহ

+50 XP

city_revenue(orders, customers) function লেখো যেটা প্রতিটা customer-এর শহরের মোট order amount দেয় — যেসব শহরের কোনো order নেই, সেগুলোও 0 দিয়ে থাকবে।

  • Return: একটা dict ({"Dhaka": ..., ...}), শহরের নাম অনুযায়ী বর্ণানুক্রমে, মান int
  • যেসব order-এর customer customers-এ নেই, সেগুলো গোনা হবে না
solution.py

বাস্তবে কোথায় ব্যবহার হয়?

একটা customer churn model-এর জন্য feature table বানানো — তিনটা table থেকে, প্রতিটা customer-এর জন্য একটা row:

main.py

Customer 3 কখনো order করেননি — how="left" না দিলে তিনি হারিয়ে যেতেন, অথচ তিনিই churn করেছেন! প্রায় সব tabular ML project-এর বড় অংশ এই কাজ: অনেক table থেকে groupby + merge দিয়ে এক row-এক entity table বানানো।

Interview প্রশ্ন

  • Beginner: Inner আর left join-এর পার্থক্য কী?
  • Intermediate: Merge-এর পর row সংখ্যা বেড়ে গেলে কী সন্দেহ করবে, কীভাবে যাচাই করবে?
  • Advanced: Time-series data merge করার সময় ভবিষ্যতের তথ্য ঢুকে যাওয়া (leakage) কীভাবে এড়াবে? merge_asof কী?

এরপর কী?

Pandas module-এর শেষ lesson — column-এর মান রূপান্তর: নিজের function প্রয়োগ, category বানানো, তারিখ থেকে feature। পরের lesson: apply ও Transformations।