FA-TOOLS — Header Component

کدهای آماده برای merge و join در pandas

سلام رفیق برنامه‌نویس! اینجا دقیقاً همون جاییه که قراره گره از کار پیچیده ترکیب داده‌هات با پانداس باز کنیم. اگه از سر و کله زدن با دیتافریم‌های جدا و وصل کردنشون خسته شدی، خبر خوب اینه که دیگه لازم نیست چرخ رو از نو اختراع کنی. تمام کدهای آماده و کاربردی برای `merge` و `join` رو اینجا جمع کردم تا تو فقط کپی کنی و پروژه رو جلو ببری. آماده‌ای؟ بزن بریم دنیای پانداس!

🚀 نقشه راه سریع: هر آنچه باید بدانی!

کدهای آماده برای merge و join در pandas — تصویر 1

▪️ Pandas Merge چیست؟

✅ ترکیب دیتافریم‌ها بر اساس ستون‌های مشترک.

💡 انعطاف‌پذیرتر و قدرتمندتر از `join`.

🔄 انواع ادغام: `inner`, `outer`, `left`, `right`.

▪️ Pandas Join چیست؟

✅ یک متد راحت برای ادغام بر اساس ایندکس.

💡 ساده‌تر برای موارد خاص (ایندکس محور).

➡️ پیش‌فرض: `left join` (با ایندکس).

▪️ نکات کلیدی!

  • `on`: تعیین ستون(ها) برای `merge`.
  • `how`: نوع جوین (`inner`, `outer`, `left`, `right`).
  • `suffixes`: مدیریت ستون‌های همنام.
  • برای افزایش سرعت پروژه‌هات، حتماً یه سر به فروشگاه ابزارهای برنامه‌نویسی ما بزن! کلی اسنیپت و کد آماده برای پایتون، سی‌اس‌اس و جاوااسکریپت اونجا داریم که کارت رو راه میندازه.

▪️ عیب‌یابی سریع!

  • KeyError: ستون `on` اشتباهه یا وجود نداره.
  • ستون‌های تکراری: از `suffixes` استفاده کن.
  • ترتیب ستون‌ها: قبل از `merge` دیتافریم‌ها رو آماده کن.

📞 نیاز به کمک فوری داری؟ با ما تماس بگیر: 09202232789

Merge چیست و چگونه کار می‌کند؟

کدهای آماده برای merge و join در pandas — تصویر 3

وقتی با پانداس کار می‌کنی، زیاد پیش می‌آد که اطلاعاتت تو چندتا دیتافریم جداگونه ذخیره شده باشن. مثلاً، اطلاعات مشتری‌ها تو یه دیتافریم و خریدهای اون‌ها تو یه دیتافریم دیگه. اینجا `merge` میاد وسط و مثل یه چسب فوق‌العاده عمل می‌کنه تا این دیتافریم‌ها رو بر اساس ستون‌های مشترک یا کلیدها به هم وصل کنه. دقیقاً شبیه کاری که `JOIN` تو پایگاه داده‌های رابطه‌ای (SQL) انجام می‌ده.

فرض کن دو تا جدول داری. جدول اول شامل `ID مشتری` و `نام مشتری`، و جدول دوم شامل `ID مشتری` و `محصول خریداری شده`. `merge` این دو تا رو با استفاده از `ID مشتری` به هم وصل می‌کنه و نتیجه یه جدول جامع می‌شه که توش نام هر مشتری کنار محصولی که خریده، قرار می‌گیره. این کار بهت کمک می‌کنه تا داده‌هات رو یکپارچه کنی و تحلیل‌های پیچیده‌تری انجام بدی.

کاربرد Merge در دنیای واقعی

بیا یه مثال واقعی بزنیم. یه شرکت که باهاش کار می‌کنی، اطلاعات فروش رو تو یه فایل CSV داره و اطلاعات دموگرافیک مشتری‌ها رو تو یه فایل دیگه. اگه بخوای ببینی کدوم گروه سنی بیشتر از کدوم محصول خرید می‌کنن، باید این دو تا دیتافریم رو اول به هم وصل کنی. `pd.merge()` دقیقاً همین کار رو برات انجام می‌ده و اطلاعات رو بر اساس یه شناسه مشترک (مثل `customer_id`) به هم می‌چسبونه. این یکی از پرکاربردترین متدهای پانداسه و بدون اون، تحلیل داده‌ها خیلی سخت‌تر و طاقت‌فرسا می‌شه.

نکته:

این متد قدرتمند بهت اجازه می‌ده تا حتی اگه ستون‌های مشترک اسامی متفاوتی داشته باشن، اون‌ها رو به هم وصل کنی. اینجاست که پارامترهای left_on و right_on به کارت میان.

انواع Merge که باید بدانی!

مثل SQL، تو پانداس هم چند نوع `merge` داریم که هر کدوم بسته به نیازمون استفاده می‌شن. این انواع به پارامتر `how` بستگی دارن و خیلی مهمن که تفاوتشون رو بدونی:

Inner Merge (فقط مشترکات)

این نوع `merge`، فقط ردیف‌هایی رو برمی‌گردونه که کلید مشترک در هر دو دیتافریم وجود داشته باشه. اگه یه کلید تو یکی از دیتافریم‌ها باشه ولی تو اون یکی نباشه، اون ردیف کلاً حذف می‌شه.


import pandas as pd

df1 = pd.DataFrame({'ID': [1, 2, 3, 4], 'Name': ['علی', 'سارا', 'رضا', 'مریم']})
df2 = pd.DataFrame({'ID': [1, 2, 5, 6], 'City': ['تهران', 'اصفهان', 'شیراز', 'مشهد']})

# Inner Merge
result_inner = pd.merge(df1, df2, on='ID', how='inner')
print("Inner Merge:")
print(result_inner)
#   ID  Name    City
# 0   1   علی   تهران
# 1   2  سارا  اصفهان
    

Outer Merge (همه چی تمام)

`Outer merge` یا `Full outer join` تمام ردیف‌ها از هر دو دیتافریم رو نگه می‌داره. اگه برای یه کلید خاص تو یکی از دیتافریم‌ها اطلاعاتی نباشه، جای اون با `NaN` (Not a Number) پر می‌شه. این یعنی هیچ داده‌ای رو از دست نمی‌دی.


# Outer Merge
result_outer = pd.merge(df1, df2, on='ID', how='outer')
print("nOuter Merge:")
print(result_outer)
#   ID  Name     City
# 0   1   علی    تهران
# 1   2  سارا   اصفهان
# 2   3   رضا      NaN
# 3   4  مریم      NaN
# 4   5   NaN    شیراز
# 5   6   NaN    مشهد
    

Left Merge (سمت چپ اصل است)

با `left merge`، تمام ردیف‌های دیتافریم سمت چپ (اولین دیتافریم تو تابع `merge`) حفظ می‌شن و فقط اطلاعات منطبق از دیتافریم سمت راست بهش اضافه می‌شه. اگه برای یه ردیف از دیتافریم چپ، کلید مطابق تو دیتافریم راست پیدا نشه، ستون‌های مربوط به دیتافریم راست با `NaN` پر می‌شن.


# Left Merge
result_left = pd.merge(df1, df2, on='ID', how='left')
print("nLeft Merge:")
print(result_left)
#   ID  Name     City
# 0   1   علی    تهران
# 1   2  سارا   اصفهان
# 2   3   رضا      NaN
# 3   4  مریم      NaN
    

Right Merge (سمت راست اصل است)

`Right merge` دقیقاً برعکس `left merge` عمل می‌کنه. یعنی تمام ردیف‌های دیتافریم سمت راست (دومین دیتافریم) حفظ می‌شن و اطلاعات منطبق از دیتافریم سمت چپ بهش اضافه می‌شه. اینجا هم اگه کلید مطابق تو دیتافریم چپ پیدا نشه، با `NaN` پر می‌شه.


# Right Merge
result_right = pd.merge(df1, df2, on='ID', how='right')
print("nRight Merge:")
print(result_right)
#   ID  Name    City
# 0   1   علی   تهران
# 1   2  سارا  اصفهان
# 2   5   NaN   شیراز
# 3   6   NaN   مشهد
    

Join در Pandas به چه دردی می‌خورد؟

`join` هم مثل `merge` برای ترکیب دیتافریم‌ها استفاده می‌شه، اما تفاوت اصلیش اینه که `join` به طور پیش‌فرض روی ایندکس دیتافریم‌ها کار می‌کنه، نه ستون‌های معمولی. این متد بیشتر برای مواقعی مناسبه که ایندکس‌های دیتافریم‌هات از قبل معنا دارن و می‌خوای بر اساس اون‌ها ترکیب رو انجام بدی. در واقع، `join` یه جور `merge` ساده شده برای ایندکس‌هاست.

وقتی از `df.join()` استفاده می‌کنی، پانداس سعی می‌کنه ایندکس دیتافریم اصلی رو با ایندکس یا یه ستون از دیتافریم دیگه مطابقت بده. این روش برای سرعت و سادگی خیلی خوبه، مخصوصاً اگه دیتافریم‌هات رو از قبل با `set_index()` آماده کرده باشی.


df1 = pd.DataFrame({'Name': ['علی', 'سارا', 'رضا']}, index=[1, 2, 3])
df2 = pd.DataFrame({'City': ['تهران', 'اصفهان', 'شیراز']}, index=[1, 2, 5])

# Join (پیش فرض left join بر اساس ایندکس)
result_join = df1.join(df2, how='left')
print("nJoin (Left):")
print(result_join)
#    Name     City
# 1   علی    تهران
# 2  سارا   اصفهان
# 3   رضا      NaN
    

به صفحات کد آماده ما هم سر بزن، کلی اسنیپت پایتون خفن داریم که کارت رو راه میندازه!

تفاوت اصلی Merge و Join: کی از کدوم استفاده کنیم؟

این سوالیه که خیلی‌ها رو گیج می‌کنه. در اصل، `join` یک متد راحت برای `merge` هست که به طور پیش‌فرض روی ایندکس‌ها کار می‌کنه. بیا یه جدول مقایسه بندازیم تا قضیه برات روشن بشه:

ویژگی Merge (pd.merge())
روش پیش‌فرض ادغام بر اساس ستون(ها)
انعطاف‌پذیری خیلی زیاد، تعیین ستون‌های دلخواه با on، left_on، right_on.
انواع Join inner، outer، left، right
موارد استفاده ترکیب دیتافریم‌ها با کلیدهای مختلف، مدیریت ستون‌های همنام.
ویژگی Join (df.join())
روش پیش‌فرض ادغام بر اساس ایندکس (فهرست)
انعطاف‌پذیری کمتر، عمدتاً برای ایندکس‌ها، می‌توان on را برای یک ستون دیتافریم سمت راست استفاده کرد.
انواع Join left، outer، inner، right
موارد استفاده اضافه کردن ستون به دیتافریم بر اساس ایندکس مشترک، ساده و سریع.

در کل، اگه نیاز به کنترل دقیق روی ستون‌های کلید و انواع ادغام داری، `merge` انتخاب بهتریه. اما اگه ایندکس‌هات از قبل مرتب و آماده‌ان و می‌خوای سریع یه سری ستون اضافه کنی، `join` کار رو برات آسون‌تر می‌کنه. بیشتر اوقات از `merge` استفاده می‌شه چون عمومی‌تر و قابل کنترل‌تره.

پارامترهای کلیدی Merge و Join که شغلتو آسون می‌کنه!

برای اینکه بتونی مثل یک حرفه‌ای `merge` و `join` کنی، باید پارامترهای اصلیشون رو بشناسی:

on: ستون‌های مشترک

این پارامتر مهمترین بخش `merge` هست. باهاش می‌گی کدوم ستون یا ستون‌ها تو هر دو دیتافریم باید به عنوان کلید برای ادغام استفاده بشن. اگه ستون‌های کلید تو هر دو دیتافریم اسم یکسانی داشته باشن، می‌تونی فقط اسم ستون رو به `on` بدی.


pd.merge(df1, df2, on='ID') # ادغام بر اساس ستون 'ID'
pd.merge(df1, df2, on=['ID', 'Region']) # ادغام بر اساس چندین ستون
    

left_on و right_on: ستون‌های با نام‌های مختلف

اگه ستون‌های کلید تو دو تا دیتافریم اسم‌های متفاوتی دارن، از این دو تا پارامتر استفاده می‌کنی. `left_on` اسم ستون کلید تو دیتافریم چپ و `right_on` اسم ستون کلید تو دیتافریم راست رو مشخص می‌کنه.


df_customers = pd.DataFrame({'CustomerID': [1, 2, 3], 'Name': ['آرش', 'بهنام', 'جواد']})
df_orders = pd.DataFrame({'OrderID': [101, 102, 103], 'UserRef': [1, 3, 4], 'Product': ['کتاب', 'لپتاپ', 'موس']})

result = pd.merge(df_customers, df_orders, left_on='CustomerID', right_on='UserRef', how='inner')
print(result)
#    CustomerID    Name  OrderID  UserRef Product
# 0           1    آرش      101        1    کتاب
# 1           3   جواد      102        3  لپتاپ
    

برای کدها و اسنیپت‌های بیشتر، حتماً یه سر به بخش اسنیپت‌های ما بزن!

how: نوع Join

این پارامتر همونطور که قبلاً گفتم، مشخص می‌کنه که چه نوع ادغامی می‌خوای: `’inner’`, `’outer’`, `’left’`, `’right’`.


pd.merge(df1, df2, on='ID', how='left') # left join
    

suffixes: حل مشکل نام‌های تکراری

اگه هر دو دیتافریم ستون‌هایی با اسم یکسان (غیر از ستون‌های کلید) داشته باشن، پانداس به صورت خودکار بهشون پسوند `_x` و `_y` اضافه می‌کنه. با `suffixes` می‌تونی این پسوندها رو خودت تعیین کنی تا خوانایی دیتافریم نتیجه بهتر بشه.


df_users = pd.DataFrame({'ID': [1, 2], 'Name': ['وحید', 'ندا'], 'Age': [30, 25]})
df_profile = pd.DataFrame({'ID': [1, 3], 'Job': ['مهندس', 'طراح'], 'Age': [32, 28]})

merged_df = pd.merge(df_users, df_profile, on='ID', how='outer', suffixes=('_user', '_profile'))
print(merged_df)
#    ID  Name  Age_user    Job  Age_profile
# 0   1    وحید      30.0   مهندس         32.0
# 1   2    ندا      25.0    NaN          NaN
# 2   3     NaN       NaN   طراح         28.0
    

left_index و right_index: ادغام با ایندکس

اگه می‌خوای یکی یا هر دو دیتافریم رو بر اساس ایندکسشون ادغام کنی، این پارامترها رو `True` قرار بده. این دقیقاً همون چیزیه که `join` به طور پیش‌فرض انجام می‌ده.


df_a = pd.DataFrame({'Value_A': [10, 20]}, index=['K1', 'K2'])
df_b = pd.DataFrame({'Value_B': [100, 200]}, index=['K1', 'K3'])

merged_by_index = pd.merge(df_a, df_b, left_index=True, right_index=True, how='outer')
print(merged_by_index)
#    Value_A  Value_B
# K1    10.0    100.0
# K2    20.0      NaN
# K3     NaN    200.0
    

برای اسنیپت‌های CSS هم کلی چیز میز داریم: کدهای آماده CSS.

کدهای آماده و مثال‌های کاربردی

خب، رسیدیم به بخش جذاب ماجرا! اینجا چند تا سناریوی رایج رو با کدهای آماده برات آوردم که می‌تونی مستقیم کپی کنی و تو پروژه‌هات استفاده کنی.

مثال 1: Merge ساده با یک ستون

این رایج‌ترین حالته. دو تا دیتافریم داریم که یه ستون مشترک دارن و می‌خوایم بر اساس اون‌ها رو `inner merge` کنیم.


import pandas as pd

# دیتافریم اطلاعات محصولات
products = pd.DataFrame({
    'product_id': [1, 2, 3, 4],
    'name': ['لپتاپ', 'موبایل', 'هدفون', 'ماوس'],
    'price': [1200, 800, 150, 25]
})

# دیتافریم موجودی انبار
inventory = pd.DataFrame({
    'product_id': [1, 2, 3, 5],
    'stock': [10, 25, 50, 5]
})

# Inner Merge بر اساس 'product_id'
merged_products_inventory = pd.merge(products, inventory, on='product_id', how='inner')
print("Inner Merge محصولات و موجودی:")
print(merged_products_inventory)
#    product_id    name  price  stock
# 0           1    لپتاپ   1200     10
# 1           2  موبایل    800     25
# 2           3   هدفون    150     50
    

مثال 2: Merge با نام‌های ستون متفاوت

وقتی ستون‌های کلید تو دو تا دیتافریم اسم‌های مختلفی دارن. مثلاً یکی `user_id` و اون یکی `customer_id`.


# دیتافریم کاربران
users = pd.DataFrame({
    'user_id': [101, 102, 103],
    'username': ['ali', 'sara', 'reza']
})

# دیتافریم سفارشات (کلید اینجا 'customer_id' است)
orders = pd.DataFrame({
    'order_id': [1001, 1002, 1003, 1004],
    'customer_id': [101, 103, 101, 104],
    'amount': [50, 120, 75, 200]
})

# Left Merge با استفاده از left_on و right_on
merged_users_orders = pd.merge(users, orders, left_on='user_id', right_on='customer_id', how='left')
print("nLeft Merge کاربران و سفارشات:")
print(merged_users_orders)
#    user_id username  order_id  customer_id  amount
# 0      101      ali    1001.0        101.0    50.0
# 1      101      ali    1003.0        101.0    75.0
# 2      102     sara       NaN          NaN     NaN
# 3      103     reza    1002.0        103.0   120.0
    

به یاد داشته باش، برای داشتن یه سایت عالی، به کدهای آماده HTML هم نیاز داری!

مثال 3: Join با ایندکس

این سناریو برای مواقعیه که ایندکس دیتافریم‌ها شناسه اصلی توئه.


# دیتافریم A با ایندکس سفارشی
df_a_idx = pd.DataFrame({'value_A': ['X', 'Y', 'Z']}, index=['id1', 'id2', 'id3'])

# دیتافریم B با ایندکس سفارشی
df_b_idx = pd.DataFrame({'value_B': [10, 20]}, index=['id1', 'id4'])

# Left Join بر اساس ایندکس
joined_df = df_a_idx.join(df_b_idx, how='left')
print("nJoin بر اساس ایندکس (Left):")
print(joined_df)
#     value_A  value_B
# id1       X     10.0
# id2       Y      NaN
# id3       Z      NaN
    

دنبال کدهای آماده جاوااسکریپت هم هستی؟ یه سر به سایت ما بزن!

عیب‌یابی سریع و حل مشکلات رایج

حالا که با کدها آشنا شدی، طبیعیه که تو دنیای واقعی یه سری مشکل برات پیش بیاد. نگران نباش، این بخش برای همینه که تو رو از شر دردسرها نجات بده.

مشکل 1: KeyError: 'SomeColumn'

توضیح: این ارور یعنی ستونی که به عنوان کلید (تو `on`, `left_on`, `right_on`) مشخص کردی، تو یکی از دیتافریم‌ها وجود نداره. خیلی از برنامه‌نویسان تازه‌کار این مشکل رو دارن.

راه حل: قبل از `merge`، حتماً اسم ستون‌ها رو چک کن. می‌تونی از `df.columns` برای دیدن لیست ستون‌ها استفاده کنی تا مطمئن بشی اسم ستون‌ها دقیقاً همونیه که باید باشه.


# مثال: ستون 'IDD' وجود نداره
df1 = pd.DataFrame({'ID': [1, 2], 'Name': ['A', 'B']})
df2 = pd.DataFrame({'ID': [1, 3], 'Value': [10, 20]})

# df1.columns # خروجی: Index(['ID', 'Name'], dtype='object')
# df2.columns # خروجی: Index(['ID', 'Value'], dtype='object')

# pd.merge(df1, df2, on='IDD') # این ارور میده!
# راه حل:
result = pd.merge(df1, df2, on='ID') # ستون درست رو استفاده کن
        

مشکل 2: ستون‌های تکراری با نام یکسان در نتیجه

توضیح: وقتی دو تا دیتافریم ستون‌هایی دارن که اسمشون مشترکه (غیر از ستون کلید ادغام)، پانداس به صورت پیش‌فرض بهشون پسوندهای `_x` و `_y` اضافه می‌کنه. گاهی اوقات این پسوندها باعث شلختگی می‌شن.

راه حل: از پارامتر `suffixes` استفاده کن تا پسوندهای دلخواه خودت رو اعمال کنی. اینجوری خروجی خیلی خواناتر می‌شه و با نظم و ترتیت کار میکنی.


df_users = pd.DataFrame({'ID': [1, 2], 'Name': ['وحید', 'ندا'], 'Age': [30, 25]})
df_profile = pd.DataFrame({'ID': [1, 3], 'Job': ['مهندس', 'طراح'], 'Age': [32, 28]})

merged_df_custom_suffixes = pd.merge(df_users, df_profile, on='ID', how='outer', suffixes=('_کاربر', '_پروفایل'))
print(merged_df_custom_suffixes)
#    ID  Name  Age_کاربر    Job  Age_پروفایل
# 0   1    وحید      30.0   مهندس         32.0
# 1   2    ندا      25.0    NaN          NaN
# 2   3     NaN       NaN   طراح         28.0
        

مشکل 3: حجم بالای داده و مشکل حافظه (MemoryError)

توضیح: وقتی با دیتافریم‌های خیلی بزرگ کار می‌کنی و می‌خوای `outer merge` انجام بدی، ممکنه حجم حافظه (RAM) سیستم کم بیاد و ارور `MemoryError` بگیری.

راه حل:

  • نوع ادغام رو بهینه کن: اگه واقعاً به `outer merge` نیاز نداری، از `inner` یا `left/right` استفاده کن. اینها فقط زیرمجموعه‌ای از داده‌ها رو برمی‌گردونن و حافظه کمتری مصرف می‌کنن.
  • انتخاب ستون‌های لازم: قبل از `merge`، فقط ستون‌هایی رو که نیاز داری از هر دیتافریم انتخاب کن. `df[[‘col1’, ‘col2’]]`. این کار حجم دیتافریم‌ها رو کم می‌کنه.
  • تغییر نوع داده (dtype): اگه می‌تونی، انواع داده ستون‌ها رو بهینه‌تر کن (مثلاً `int64` رو به `int32` یا `int16` تغییر بده اگه اعداد کوچیکن). با `df.astype()` این کار رو انجام بده.
  • استفاده از Dask: برای دیتافریم‌های واقعاً عظیم که تو RAM جا نمی‌شن، `Dask` یه راه حل عالیه. `Dask DataFrames` قابلیت‌های پانداس رو روی دیسک (out-of-core) اجرا می‌کنه.

مشکل 4: ترتیب نامطلوب ستون‌ها در دیتافریم نتیجه

توضیح: بعد از `merge`، ممکنه ستون‌های دیتافریم نتیجه به ترتیبی نباشن که دلت می‌خواد.

راه حل: بعد از عملیات `merge`، می‌تونی ستون‌ها رو به ترتیب دلخواه خودت مرتب کنی. کافیه یه لیست از اسم ستون‌ها به ترتیب مورد نظر بسازی و به دیتافریم جدیدت بدی.


df_merged = pd.merge(df1, df2, on='ID')
# فرض کن df_merged ستون های 'ID', 'Name', 'City' رو داره
# میخوایم 'Name' اول باشه، بعد 'City' و بعد 'ID'
desired_order = ['Name', 'City', 'ID']
df_reordered = df_merged[desired_order]
print(df_reordered)
        

یادت باشه، ابزارهای زیادی برای وردپرس وجود داره. برای اطلاعات بیشتر کدهای آماده وردپرس رو ببین.

سوالات متداول در مورد Merge و Join

پرسش 1: آیا `merge` همیشه سریع‌تر از `join` است؟

پاسخ: نه لزوماً. `join` در واقع یک متد wrapper برای `merge` است که به طور پیش‌فرض روی ایندکس‌ها عمل می‌کند. اگر دیتافریم‌های شما از قبل ایندکس‌گذاری شده باشند و کلیدهای شما همان ایندکس‌ها باشند، `join` می‌تواند کمی سریع‌تر یا حداقل به همان سرعت `merge` باشد زیرا نیازی به جستجوی ستون‌ها ندارد. اما برای ادغام‌های پیچیده‌تر بر اساس ستون‌های مختلف، `merge` انعطاف‌پذیری بیشتری دارد و به طور کلی قدرتمندتر است.

پرسش 2: چطور می‌توانم چندین دیتافریم را همزمان `merge` کنم؟

پاسخ: پانداس به طور مستقیم تابعی برای ادغام همزمان بیش از دو دیتافریم ندارد. اما می‌توانید این کار را به صورت زنجیره‌ای انجام دهید. به این صورت که ابتدا دو دیتافریم را `merge` کرده و سپس نتیجه را با دیتافریم سوم `merge` کنید و همینطور ادامه دهید.


df_a = pd.DataFrame({'ID': [1, 2], 'Val_A': ['A1', 'A2']})
df_b = pd.DataFrame({'ID': [1, 3], 'Val_B': ['B1', 'B2']})
df_c = pd.DataFrame({'ID': [1, 4], 'Val_C': ['C1', 'C2']})

# merge زنجیره‌ای
merged_abc = pd.merge(df_a, df_b, on='ID', how='outer')
merged_abc = pd.merge(merged_abc, df_c, on='ID', how='outer')
print(merged_abc)
#    ID Val_A Val_B Val_C
# 0   1    A1    B1    C1
# 1   2    A2   NaN   NaN
# 2   3   NaN    B2   NaN
# 3   4   NaN   NaN    C2
        

پرسش 3: چگونه می‌توانم عملکرد `merge`/`join` را برای دیتافریم‌های بزرگ بهبود بخشم؟

پاسخ: علاوه بر راهکارهای ذکر شده در بخش عیب‌یابی (مثل کاهش ستون‌ها و بهینه‌سازی نوع داده)، می‌توانید نکات زیر را نیز مد نظر قرار دهید:

  • مرتب‌سازی قبل از ادغام: اگر کلیدهای ادغام در هر دو دیتافریم مرتب شده باشند، گاهی اوقات می‌تواند به سرعت عملیات کمک کند، هرچند پانداس به طور پیش‌فرض از الگوریتم‌های بهینه استفاده می‌کند.
  • ایندکس‌گذاری موقت: اگر از `merge` روی ستون‌های غیر ایندکسی استفاده می‌کنید اما آن ستون‌ها مرتباً برای ادغام استفاده می‌شوند، می‌توانید آن‌ها را موقتاً به ایندکس تبدیل کنید. (`df.set_index(‘column_name’, inplace=True)`)
  • استفاده از `fuzzymatcher`: برای ادغام‌هایی که نیاز به تطابق “تقریبی” دارند (fuzzy matching)، کتابخانه‌هایی مانند `fuzzymatcher` می‌توانند مفید باشند، اما از نظر عملکرد کندتر هستند.

پرسش 4: آیا `merge` و `concat` یکی هستند؟

پاسخ: خیر، `merge` و `concat` اهداف متفاوتی دارند. `merge` (یا `join`) برای ترکیب دیتافریم‌ها بر اساس یک یا چند کلید مشترک است، شبیه به عملیات `JOIN` در SQL. در حالی که `concat` برای “الحاق” (stacking) دیتافریم‌ها روی هم یا کنار هم استفاده می‌شود، یعنی اضافه کردن ردیف‌ها یا ستون‌ها به یکدیگر. `concat` معمولاً برای ترکیب دیتافریم‌هایی استفاده می‌شود که ساختار مشابهی دارند.


df_part1 = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})
df_part2 = pd.DataFrame({'A': [5, 6], 'B': [7, 8]})

# concat روی هم (افزودن ردیف)
combined_rows = pd.concat([df_part1, df_part2])
print("nConcat (ردیف‌ها):")
print(combined_rows)
#    A  B
# 0  1  3
# 1  2  4
# 0  5  7
# 1  6  8

df_part3 = pd.DataFrame({'C': [9, 10]}, index=[0,1])
# concat کنار هم (افزودن ستون)
combined_cols = pd.concat([df_part1, df_part3], axis=1)
print("nConcat (ستون‌ها):")
print(combined_cols)
#    A  B   C
# 0  1  3   9
# 1  2  4  10
        

امیدوارم این مقاله جامع و کدهای آماده، کار شما رو تو پانداس حسابی راه بندازه و دیگه نگران ادغام دیتافریم‌هات نباشی. برنامه‌نویسی با ابزارهای درست و دانش کافی، همیشه شیرین‌تره! برای کدهای بیشتر، یادگیری‌های جدید و ابزارهای کاربردی، حتماً به سایت fa-tools.ir سر بزن. همیشه اونجا کلی چیزهای به درد بخور پیدا می‌کنی!

💡 یادت نره که برای حرفه‌ای‌تر شدن، به ابزارهای مناسب نیاز داری!

همین حالا از فروشگاه ابزارهای برنامه‌نویسی ما دیدن کن و بهره‌وری‌ت رو چند برابر کن!

📞 تماس فوری: 09202232789

کدهای آماده برای merge و join در pandas

سلام رفیق برنامه‌نویس! اینجا دقیقاً همون جاییه که قراره گره از کار پیچیده ترکیب داده‌هات با پانداس باز کنیم. اگه از سر و کله زدن با دیتافریم‌های جدا و وصل کردنشون خسته شدی، خبر خوب اینه که دیگه لازم نیست چرخ رو از نو اختراع کنی. تمام کدهای آماده و کاربردی برای `merge` و `join` رو اینجا جمع کردم تا تو فقط کپی کنی و پروژه رو جلو ببری. آماده‌ای؟ بزن بریم دنیای پانداس!

🚀 نقشه راه سریع: هر آنچه باید بدانی!

▪️ Pandas Merge چیست؟

  • ترکیب دیتافریم‌ها بر اساس ستون‌های مشترک.
  • 💡 انعطاف‌پذیرتر و قدرتمندتر از `join`.
  • 🔄 انواع ادغام: `inner`, `outer`, `left`, `right`.

▪️ Pandas Join چیست؟

  • یک متد راحت برای ادغام بر اساس ایندکس.
  • 💡 ساده‌تر برای موارد خاص (ایندکس محور).
  • ➡️ پیش‌فرض: `left join` (با ایندکس).

▪️ نکات کلیدی!

  • 📌 `on`: تعیین ستون(ها) برای `merge`.
  • 📌 `how`: نوع جوین (`inner`, `outer`, `left`, `right`).
  • 📌 `suffixes`: مدیریت ستون‌های همنام.
  • برای افزایش سرعت پروژه‌هات، حتماً یه سر به فروشگاه ابزارهای برنامه‌نویسی ما بزن! کلی اسنیپت و کد آماده برای پایتون، سی‌اس‌اس و جاوااسکریپت اونجا داریم که کارت رو راه میندازه.

▪️ عیب‌یابی سریع!

  • ⚠️ KeyError: ستون `on` اشتباهه یا وجود نداره.
  • ⚠️ ستون‌های تکراری: از `suffixes` استفاده کن.
  • ⚠️ ترتیب ستون‌ها: قبل از `merge` دیتافریم‌ها رو آماده کن.

📞 نیاز به کمک فوری داری؟ با ما تماس بگیر: 09202232789

Merge چیست و چگونه کار می‌کند؟

وقتی با پانداس کار می‌کنی، زیاد پیش می‌آد که اطلاعاتت تو چندتا دیتافریم جداگونه ذخیره شده باشن. مثلاً، اطلاعات مشتری‌ها تو یه دیتافریم و خریدهای اون‌ها تو یه دیتافریم دیگه. اینجا `merge` میاد وسط و مثل یه چسب فوق‌العاده عمل می‌کنه تا این دیتافریم‌ها رو بر اساس ستون‌های مشترک یا کلیدها به هم وصل کنه. دقیقاً شبیه کاری که `JOIN` تو پایگاه داده‌های رابطه‌ای (SQL) انجام می‌ده.

فرض کن دو تا جدول داری. جدول اول شامل `ID مشتری` و `نام مشتری`، و جدول دوم شامل `ID مشتری` و `محصول خریداری شده`. `merge` این دو تا رو با استفاده از `ID مشتری` به هم وصل می‌کنه و نتیجه یه جدول جامع می‌شه که توش نام هر مشتری کنار محصولی که خریده، قرار می‌گیره. این کار بهت کمک می‌کنه تا داده‌هات رو یکپارچه کنی و تحلیل‌های پیچیده‌تری انجام بدی.

کاربرد Merge در دنیای واقعی

بیا یه مثال واقعی بزنیم. یه شرکت که باهاش کار می‌کنی، اطلاعات فروش رو تو یه فایل CSV داره و اطلاعات دموگرافیک مشتری‌ها رو تو یه فایل دیگه. اگه بخوای ببینی کدوم گروه سنی بیشتر از کدوم محصول خرید می‌کنن، باید این دو تا دیتافریم رو اول به هم وصل کنی. `pd.merge()` دقیقاً همین کار رو برات انجام می‌ده و اطلاعات رو بر اساس یه شناسه مشترک (مثل `customer_id`) به هم می‌چسبونه. این یکی از پرکاربردترین متدهای پانداسه و بدون اون، تحلیل داده‌ها خیلی سخت‌تر و طاقت‌فرسا می‌شه.

نکته:

این متد قدرتمند بهت اجازه می‌ده تا حتی اگه ستون‌های مشترک اسامی متفاوتی داشته باشن، اون‌ها رو به هم وصل کنی. اینجاست که پارامترهای left_on و right_on به کارت میان.

انواع Merge که باید بدانی!

مثل SQL، تو پانداس هم چند نوع `merge` داریم که هر کدوم بسته به نیازمون استفاده می‌شن. این انواع به پارامتر `how` بستگی دارن و خیلی مهمن که تفاوتشون رو بدونی:

Inner Merge (فقط مشترکات)

این نوع `merge`، فقط ردیف‌هایی رو برمی‌گردونه که کلید مشترک در هر دو دیتافریم وجود داشته باشه. اگه یه کلید تو یکی از دیتافریم‌ها باشه ولی تو اون یکی نباشه، اون ردیف کلاً حذف می‌شه.


import pandas as pd

df1 = pd.DataFrame({'ID': [1, 2, 3, 4], 'Name': ['علی', 'سارا', 'رضا', 'مریم']})
df2 = pd.DataFrame({'ID': [1, 2, 5, 6], 'City': ['تهران', 'اصفهان', 'شیراز', 'مشهد']})

# Inner Merge
result_inner = pd.merge(df1, df2, on='ID', how='inner')
print("Inner Merge:")
print(result_inner)
#   ID  Name    City
# 0   1   علی   تهران
# 1   2  سارا  اصفهان
    

Outer Merge (همه چی تمام)

`Outer merge` یا `Full outer join` تمام ردیف‌ها از هر دو دیتافریم رو نگه می‌داره. اگه برای یه کلید خاص تو یکی از دیتافریم‌ها اطلاعاتی نباشه، جای اون با `NaN` (Not a Number) پر می‌شه. این یعنی هیچ داده‌ای رو از دست نمی‌دی.


# Outer Merge
result_outer = pd.merge(df1, df2, on='ID', how='outer')
print("nOuter Merge:")
print(result_outer)
#   ID  Name     City
# 0   1   علی    تهران
# 1   2  سارا   اصفهان
# 2   3   رضا      NaN
# 3   4  مریم      NaN
# 4   5   NaN    شیراز
# 5   6   NaN    مشهد
    

Left Merge (سمت چپ اصل است)

با `left merge`، تمام ردیف‌های دیتافریم سمت چپ (اولین دیتافریم تو تابع `merge`) حفظ می‌شن و فقط اطلاعات منطبق از دیتافریم سمت راست بهش اضافه می‌شه. اگه برای یه ردیف از دیتافریم چپ، کلید مطابق تو دیتافریم راست پیدا نشه، ستون‌های مربوط به دیتافریم راست با `NaN` پر می‌شن.


# Left Merge
result_left = pd.merge(df1, df2, on='ID', how='left')
print("nLeft Merge:")
print(result_left)
#   ID  Name     City
# 0   1   علی    تهران
# 1   2  سارا   اصفهان
# 2   3   رضا      NaN
# 3   4  مریم      NaN
    

Right Merge (سمت راست اصل است)

`Right merge` دقیقاً برعکس `left merge` عمل می‌کنه. یعنی تمام ردیف‌های دیتافریم سمت راست (دومین دیتافریم) حفظ می‌شن و اطلاعات منطبق از دیتافریم سمت چپ بهش اضافه می‌شه. اینجا هم اگه کلید مطابق تو دیتافریم چپ پیدا نشه، با `NaN` پر می‌شه.


# Right Merge
result_right = pd.merge(df1, df2, on='ID', how='right')
print("nRight Merge:")
print(result_right)
#   ID  Name    City
# 0   1   علی   تهران
# 1   2  سارا  اصفهان
# 2   5   NaN   شیراز
# 3   6   NaN   مشهد
    

Join در Pandas به چه دردی می‌خورد؟

`join` هم مثل `merge` برای ترکیب دیتافریم‌ها استفاده می‌شه، اما تفاوت اصلیش اینه که `join` به طور پیش‌فرض روی ایندکس دیتافریم‌ها کار می‌کنه، نه ستون‌های معمولی. این متد بیشتر برای مواقعی مناسبه که ایندکس‌های دیتافریم‌هات از قبل معنا دارن و می‌خوای بر اساس اون‌ها ترکیب رو انجام بدی. در واقع، `join` یه جور `merge` ساده شده برای ایندکس‌هاست.

وقتی از `df.join()` استفاده می‌کنی، پانداس سعی می‌کنه ایندکس دیتافریم اصلی رو با ایندکس یا یه ستون از دیتافریم دیگه مطابقت بده. این روش برای سرعت و سادگی خیلی خوبه، مخصوصاً اگه دیتافریم‌هات رو از قبل با `set_index()` آماده کرده باشی.


df1 = pd.DataFrame({'Name': ['علی', 'سارا', 'رضا']}, index=[1, 2, 3])
df2 = pd.DataFrame({'City': ['تهران', 'اصفهان', 'شیراز']}, index=[1, 2, 5])

# Join (پیش فرض left join بر اساس ایندکس)
result_join = df1.join(df2, how='left')
print("nJoin (Left):")
print(result_join)
#    Name     City
# 1   علی    تهران
# 2  سارا   اصفهان
# 3   رضا      NaN
    

به صفحات کد آماده ما هم سر بزن، کلی اسنیپت پایتون خفن داریم که کارت رو راه میندازه!

تفاوت اصلی Merge و Join: کی از کدوم استفاده کنیم؟

این سوالیه که خیلی‌ها رو گیج می‌کنه. در اصل، `join` یک متد راحت برای `merge` هست که به طور پیش‌فرض روی ایندکس‌ها کار می‌کنه. بیا یه جدول مقایسه بندازیم تا قضیه برات روشن بشه:

ویژگی Merge (pd.merge())
روش پیش‌فرض ادغام بر اساس ستون(ها)
انعطاف‌پذیری خیلی زیاد، تعیین ستون‌های دلخواه با on، left_on، right_on.
انواع Join inner، outer، left، right
موارد استفاده ترکیب دیتافریم‌ها با کلیدهای مختلف، مدیریت ستون‌های همنام.
ویژگی Join (df.join())
روش پیش‌فرض ادغام بر اساس ایندکس (فهرست)
انعطاف‌پذیری کمتر، عمدتاً برای ایندکس‌ها، می‌توان on را برای یک ستون دیتافریم سمت راست استفاده کرد.
انواع Join left، outer، inner، right
موارد استفاده اضافه کردن ستون به دیتافریم بر اساس ایندکس مشترک، ساده و سریع.

در کل، اگه نیاز به کنترل دقیق روی ستون‌های کلید و انواع ادغام داری، `merge` انتخاب بهتریه. اما اگه ایندکس‌هات از قبل مرتب و آماده‌ان و می‌خوای سریع یه سری ستون اضافه کنی، `join` کار رو برات آسون‌تر می‌کنه. بیشتر اوقات از `merge` استفاده می‌شه چون عمومی‌تر و قابل کنترل‌تره.

پارامترهای کلیدی Merge و Join که شغلتو آسون می‌کنه!

برای اینکه بتونی مثل یک حرفه‌ای `merge` و `join` کنی، باید پارامترهای اصلیشون رو بشناسی:

on: ستون‌های مشترک

این پارامتر مهمترین بخش `merge` هست. باهاش می‌گی کدوم ستون یا ستون‌ها تو هر دو دیتافریم باید به عنوان کلید برای ادغام استفاده بشن. اگه ستون‌های کلید تو هر دو دیتافریم اسم یکسانی داشته باشن، می‌تونی فقط اسم ستون رو به `on` بدی.


pd.merge(df1, df2, on='ID') # ادغام بر اساس ستون 'ID'
pd.merge(df1, df2, on=['ID', 'Region']) # ادغام بر اساس چندین ستون
    

left_on و right_on: ستون‌های با نام‌های مختلف

اگه ستون‌های کلید تو دو تا دیتافریم اسم‌های متفاوتی دارن، از این دو تا پارامتر استفاده می‌کنی. `left_on` اسم ستون کلید تو دیتافریم چپ و `right_on` اسم ستون کلید تو دیتافریم راست رو مشخص می‌کنه.


df_customers = pd.DataFrame({'CustomerID': [1, 2, 3], 'Name': ['آرش', 'بهنام', 'جواد']})
df_orders = pd.DataFrame({'OrderID': [101, 102, 103], 'UserRef': [1, 3, 4], 'Product': ['کتاب', 'لپتاپ', 'موس']})

result = pd.merge(df_customers, df_orders, left_on='CustomerID', right_on='UserRef', how='inner')
print(result)
#    CustomerID    Name  OrderID  UserRef Product
# 0           1    آرش      101        1    کتاب
# 1           3   جواد      102        3  لپتاپ
    

برای کدها و اسنیپت‌های بیشتر، حتماً یه سر به بخش اسنیپت‌های ما بزن!

how: نوع Join

این پارامتر همونطور که قبلاً گفتم، مشخص می‌کنه که چه نوع ادغامی می‌خوای: `’inner’`, `’outer’`, `’left’`, `’right’`.


pd.merge(df1, df2, on='ID', how='left') # left join
    

suffixes: حل مشکل نام‌های تکراری

اگه هر دو دیتافریم ستون‌هایی با اسم یکسان (غیر از ستون‌های کلید) داشته باشن، پانداس به صورت خودکار بهشون پسوند `_x` و `_y` اضافه می‌کنه. با `suffixes` می‌تونی این پسوندها رو خودت تعیین کنی تا خوانایی دیتافریم نتیجه بهتر بشه.


df_users = pd.DataFrame({'ID': [1, 2], 'Name': ['وحید', 'ندا'], 'Age': [30, 25]})
df_profile = pd.DataFrame({'ID': [1, 3], 'Job': ['مهندس', 'طراح'], 'Age': [32, 28]})

merged_df = pd.merge(df_users, df_profile, on='ID', how='outer', suffixes=('_user', '_profile'))
print(merged_df)
#    ID  Name  Age_user    Job  Age_profile
# 0   1    وحید      30.0   مهندس         32.0
# 1   2    ندا      25.0    NaN          NaN
# 2   3     NaN       NaN   طراح         28.0
    

left_index و right_index: ادغام با ایندکس

اگه می‌خوای یکی یا هر دو دیتافریم رو بر اساس ایندکسشون ادغام کنی، این پارامترها رو `True` قرار بده. این دقیقاً همون چیزیه که `join` به طور پیش‌فرض انجام می‌ده.


df_a = pd.DataFrame({'Value_A': [10, 20]}, index=['K1', 'K2'])
df_b = pd.DataFrame({'Value_B': [100, 200]}, index=['K1', 'K3'])

merged_by_index = pd.merge(df_a, df_b, left_index=True, right_index=True, how='outer')
print(merged_by_index)
#    Value_A  Value_B
# K1    10.0    100.0
# K2    20.0      NaN
# K3     NaN    200.0
    

برای اسنیپت‌های CSS هم کلی چیز میز داریم: کدهای آماده CSS.

کدهای آماده و مثال‌های کاربردی

خب، رسیدیم به بخش جذاب ماجرا! اینجا چند تا سناریوی رایج رو با کدهای آماده برات آوردم که می‌تونی مستقیم کپی کنی و تو پروژه‌هات استفاده کنی.

مثال 1: Merge ساده با یک ستون

این رایج‌ترین حالته. دو تا دیتافریم داریم که یه ستون مشترک دارن و می‌خوایم بر اساس اون‌ها رو `inner merge` کنیم.


import pandas as pd

# دیتافریم اطلاعات محصولات
products = pd.DataFrame({
    'product_id': [1, 2, 3, 4],
    'name': ['لپتاپ', 'موبایل', 'هدفون', 'ماوس'],
    'price': [1200, 800, 150, 25]
})

# دیتافریم موجودی انبار
inventory = pd.DataFrame({
    'product_id': [1, 2, 3, 5],
    'stock': [10, 25, 50, 5]
})

# Inner Merge بر اساس 'product_id'
merged_products_inventory = pd.merge(products, inventory, on='product_id', how='inner')
print("Inner Merge محصولات و موجودی:")
print(merged_products_inventory)
#    product_id    name  price  stock
# 0           1    لپتاپ   1200     10
# 1           2  موبایل    800     25
# 2           3   هدفون    150     50
    

مثال 2: Merge با نام‌های ستون متفاوت

وقتی ستون‌های کلید تو دو تا دیتافریم اسم‌های مختلفی دارن. مثلاً یکی `user_id` و اون یکی `customer_id`.


# دیتافریم کاربران
users = pd.DataFrame({
    'user_id': [101, 102, 103],
    'username': ['ali', 'sara', 'reza']
})

# دیتافریم سفارشات (کلید اینجا 'customer_id' است)
orders = pd.DataFrame({
    'order_id': [1001, 1002, 1003, 1004],
    'customer_id': [101, 103, 101, 104],
    'amount': [50, 120, 75, 200]
})

# Left Merge با استفاده از left_on و right_on
merged_users_orders = pd.merge(users, orders, left_on='user_id', right_on='customer_id', how='left')
print("nLeft Merge کاربران و سفارشات:")
print(merged_users_orders)
#    user_id username  order_id  customer_id  amount
# 0      101      ali    1001.0        101.0    50.0
# 1      101      ali    1003.0        101.0    75.0
# 2      102     sara       NaN          NaN     NaN
# 3      103     reza    1002.0        103.0   120.0
    

به یاد داشته باش، برای داشتن یه سایت عالی، به کدهای آماده HTML هم نیاز داری!

مثال 3: Join با ایندکس

این سناریو برای مواقعیه که ایندکس دیتافریم‌ها شناسه اصلی توئه.


# دیتافریم A با ایندکس سفارشی
df_a_idx = pd.DataFrame({'value_A': ['X', 'Y', 'Z']}, index=['id1', 'id2', 'id3'])

# دیتافریم B با ایندکس سفارشی
df_b_idx = pd.DataFrame({'value_B': [10, 20]}, index=['id1', 'id4'])

# Left Join بر اساس ایندکس
joined_df = df_a_idx.join(df_b_idx, how='left')
print("nJoin بر اساس ایندکس (Left):")
print(joined_df)
#     value_A  value_B
# id1       X     10.0
# id2       Y      NaN
# id3       Z      NaN
    

دنبال کدهای آماده جاوااسکریپت هم هستی؟ یه سر به سایت ما بزن!

عیب‌یابی سریع و حل مشکلات رایج

حالا که با کدها آشنا شدی، طبیعیه که تو دنیای واقعی یه سری مشکل برات پیش بیاد. نگران نباش، این بخش برای همینه که تو رو از شر دردسرها نجات بده.

مشکل 1: KeyError: 'SomeColumn'

توضیح: این ارور یعنی ستونی که به عنوان کلید (تو `on`, `left_on`, `right_on`) مشخص کردی، تو یکی از دیتافریم‌ها وجود نداره. خیلی از برنامه‌نویسان تازه‌کار این مشکل رو دارن.

راه حل: قبل از `merge`، حتماً اسم ستون‌ها رو چک کن. می‌تونی از `df.columns` برای دیدن لیست ستون‌ها استفاده کنی تا مطمئن بشی اسم ستون‌ها دقیقاً همونیه که باید باشه.


# مثال: ستون 'IDD' وجود نداره
df1 = pd.DataFrame({'ID': [1, 2], 'Name': ['A', 'B']})
df2 = pd.DataFrame({'ID': [1, 3], 'Value': [10, 20]})

# df1.columns # خروجی: Index(['ID', 'Name'], dtype='object')
# df2.columns # خروجی: Index(['ID', 'Value'], dtype='object')

# pd.merge(df1, df2, on='IDD') # این ارور میده!
# راه حل:
result = pd.merge(df1, df2, on='ID') # ستون درست رو استفاده کن
        

مشکل 2: ستون‌های تکراری با نام یکسان در نتیجه

توضیح: وقتی دو تا دیتافریم ستون‌هایی دارن که اسمشون مشترکه (غیر از ستون کلید ادغام)، پانداس به صورت پیش‌فرض بهشون پسوندهای `_x` و `_y` اضافه می‌کنه. گاهی اوقات این پسوندها باعث شلختگی می‌شن.

راه حل: از پارامتر `suffixes` استفاده کن تا پسوندهای دلخواه خودت رو اعمال کنی. اینجوری خروجی خیلی خواناتر می‌شه و با نظم و ترتیت کار میکنی.


df_users = pd.DataFrame({'ID': [1, 2], 'Name': ['وحید', 'ندا'], 'Age': [30, 25]})
df_profile = pd.DataFrame({'ID': [1, 3], 'Job': ['مهندس', 'طراح'], 'Age': [32, 28]})

merged_df_custom_suffixes = pd.merge(df_users, df_profile, on='ID', how='outer', suffixes=('_کاربر', '_پروفایل'))
print(merged_df_custom_suffixes)
#    ID  Name  Age_کاربر    Job  Age_پروفایل
# 0   1    وحید      30.0   مهندس         32.0
# 1   2    ندا      25.0    NaN          NaN
# 2   3     NaN       NaN   طراح         28.0
        

مشکل 3: حجم بالای داده و مشکل حافظه (MemoryError)

توضیح: وقتی با دیتافریم‌های خیلی بزرگ کار می‌کنی و می‌خوای `outer merge` انجام بدی، ممکنه حجم حافظه (RAM) سیستم کم بیاد و ارور `MemoryError` بگیری.

راه حل:

  • نوع ادغام رو بهینه کن: اگه واقعاً به `outer merge` نیاز نداری، از `inner` یا `left/right` استفاده کن. اینها فقط زیرمجموعه‌ای از داده‌ها رو برمی‌گردونن و حافظه کمتری مصرف می‌کنن.
  • انتخاب ستون‌های لازم: قبل از `merge`، فقط ستون‌هایی رو که نیاز داری از هر دیتافریم انتخاب کن. `df[[‘col1’, ‘col2’]]`. این کار حجم دیتافریم‌ها رو کم می‌کنه.
  • تغییر نوع داده (dtype): اگه می‌تونی، انواع داده ستون‌ها رو بهینه‌تر کن (مثلاً `int64` رو به `int32` یا `int16` تغییر بده اگه اعداد کوچیکن). با `df.astype()` این کار رو انجام بده.
  • استفاده از Dask: برای دیتافریم‌های واقعاً عظیم که تو RAM جا نمی‌شن، `Dask` یه راه حل عالیه. `Dask DataFrames` قابلیت‌های پانداس رو روی دیسک (out-of-core) اجرا می‌کنه.

مشکل 4: ترتیب نامطلوب ستون‌ها در دیتافریم نتیجه

توضیح: بعد از `merge`، ممکنه ستون‌های دیتافریم نتیجه به ترتیبی نباشن که دلت می‌خواد.

راه حل: بعد از عملیات `merge`، می‌تونی ستون‌ها رو به ترتیب دلخواه خودت مرتب کنی. کافیه یه لیست از اسم ستون‌ها به ترتیب مورد نظر بسازی و به دیتافریم جدیدت بدی.


df_merged = pd.merge(df1, df2, on='ID')
# فرض کن df_merged ستون های 'ID', 'Name', 'City' رو داره
# میخوایم 'Name' اول باشه، بعد 'City' و بعد 'ID'
desired_order = ['Name', 'City', 'ID']
df_reordered = df_merged[desired_order]
print(df_reordered)
        

یادت باشه، ابزارهای زیادی برای وردپرس وجود داره. برای اطلاعات بیشتر کدهای آماده وردپرس رو ببین.

سوالات متداول در مورد Merge و Join

پرسش 1: آیا `merge` همیشه سریع‌تر از `join` است؟

پاسخ: نه لزوماً. `join` در واقع یک متد wrapper برای `merge` است که به طور پیش‌فرض روی ایندکس‌ها عمل می‌کند. اگر دیتافریم‌های شما از قبل ایندکس‌گذاری شده باشند و کلیدهای شما همان ایندکس‌ها باشند، `join` می‌تواند کمی سریع‌تر یا حداقل به همان سرعت `merge` باشد زیرا نیازی به جستجوی ستون‌ها ندارد. اما برای ادغام‌های پیچیده‌تر بر اساس ستون‌های مختلف، `merge` انعطاف‌پذیری بیشتری دارد و به طور کلی قدرتمندتر است.

پرسش 2: چطور می‌توانم چندین دیتافریم را همزمان `merge` کنم؟

پاسخ: پانداس به طور مستقیم تابعی برای ادغام همزمان بیش از دو دیتافریم ندارد. اما می‌توانید این کار را به صورت زنجیره‌ای انجام دهید. به این صورت که ابتدا دو دیتافریم را `merge` کرده و سپس نتیجه را با دیتافریم سوم `merge` کنید و همینطور ادامه دهید.


df_a = pd.DataFrame({'ID': [1, 2], 'Val_A': ['A1', 'A2']})
df_b = pd.DataFrame({'ID': [1, 3], 'Val_B': ['B1', 'B2']})
df_c = pd.DataFrame({'ID': [1, 4], 'Val_C': ['C1', 'C2']})

# merge زنجیره‌ای
merged_abc = pd.merge(df_a, df_b, on='ID', how='outer')
merged_abc = pd.merge(merged_abc, df_c, on='ID', how='outer')
print(merged_abc)
#    ID Val_A Val_B Val_C
# 0   1    A1    B1    C1
# 1   2    A2   NaN   NaN
# 2   3   NaN    B2   NaN
# 3   4   NaN   NaN    C2
        

پرسش 3: چگونه می‌توانم عملکرد `merge`/`join` را برای دیتافریم‌های بزرگ بهبود بخشم؟

پاسخ: علاوه بر راهکارهای ذکر شده در بخش عیب‌یابی (مثل کاهش ستون‌ها و بهینه‌سازی نوع داده)، می‌توانید نکات زیر را نیز مد نظر قرار دهید:

  • مرتب‌سازی قبل از ادغام: اگر کلیدهای ادغام در هر دو دیتافریم مرتب شده باشند، گاهی اوقات می‌تواند به سرعت عملیات کمک کند، هرچند پانداس به طور پیش‌فرض از الگوریتم‌های بهینه استفاده می‌کند.
  • ایندکس‌گذاری موقت: اگر از `merge` روی ستون‌های غیر ایندکسی استفاده می‌کنید اما آن ستون‌ها مرتباً برای ادغام استفاده می‌شوند، می‌توانید آن‌ها را موقتاً به ایندکس تبدیل کنید. (`df.set_index(‘column_name’, inplace=True)`)
  • استفاده از Dask: برای دیتافریم‌های واقعاً عظیم که تو RAM جا نمی‌شن، `Dask` یه راه حل عالیه. `Dask DataFrames` قابلیت‌های پانداس رو روی دیسک (out-of-core) اجرا می‌کنه.

پرسش 4: آیا `merge` و `concat` یکی هستند؟

پاسخ: خیر، `merge` و `concat` اهداف متفاوتی دارند. `merge` (یا `join`) برای ترکیب دیتافریم‌ها بر اساس یک یا چند کلید مشترک است، شبیه به عملیات `JOIN` در SQL. در حالی که `concat` برای “الحاق” (stacking) دیتافریم‌ها روی هم یا کنار هم استفاده می‌شود، یعنی اضافه کردن ردیف‌ها یا ستون‌ها به یکدیگر. `concat` معمولاً برای ترکیب دیتافریم‌هایی استفاده می‌شود که ساختار مشابهی دارند.


df_part1 = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})
df_part2 = pd.DataFrame({'A': [5, 6], 'B': [7, 8]})

# concat روی هم (افزودن ردیف)
combined_rows = pd.concat([df_part1, df_part2])
print("nConcat (ردیف‌ها):")
print(combined_rows)
#    A  B
# 0  1  3
# 1  2  4
# 0  5  7
# 1  6  8

df_part3 = pd.DataFrame({'C': [9, 10]}, index=[0,1])
# concat کنار هم (افزودن ستون)
combined_cols = pd.concat([df_part1, df_part3], axis=1)
print("nConcat (ستون‌ها):")
print(combined_cols)
#    A  B   C
# 0  1  3   9
# 1  2  4  10
        

امیدوارم این مقاله جامع و کدهای آماده، کار شما رو تو پانداس حسابی راه بندازه و دیگه نگران ادغام دیتافریم‌هات نباشی. برنامه‌نویسی با ابزارهای درست و دانش کافی، همیشه شیرین‌تره! برای کدهای بیشتر، یادگیری‌های جدید و ابزارهای کاربردی، حتماً به سایت fa-tools.ir سر بزن. همیشه اونجا کلی چیزهای به درد بخور پیدا می‌کنی!

💡 یادت نره که برای حرفه‌ای‌تر شدن، به ابزارهای مناسب نیاز داری!

همین حالا از فروشگاه ابزارهای برنامه‌نویسی ما دیدن کن و بهره‌وری‌ت رو چند برابر کن!

📞 تماس فوری: 09202232789

Table of Contents

آخرین نوشته‌ها