دیتافریم چیست؟ DataFrame یک ساختار داده دوبعدی و جدولی است که دادهها را در قالب سطرها و ستونهای سازمانیافته نگهداری میکند؛ میتوان آن را معادل یک صفحه گسترده (Spreadsheet) در اکسل یا یک جدول در پایگاه داده SQL در نظر گرفت. این ساختار، هسته اصلی کتابخانههای تحلیل داده مانند Pandas در پایتون است و بهدلیل بهینگی در اجرای عملیات بر روی حجم زیادی از دادهها، ابزار اصلی دانشمندان و تحلیلگران داده محسوب میشود.
در این مقاله به بررسی دقیق ساختار دیتافریم، دلایل برتری آن نسبت به ساختارهای دادهای سنتی، نحوه ایجاد و دستکاری آن در پایتون، R و Apache spark و کاربردهای عملی آن در پروژههای واقعی خواهیم پرداخت.
فهرست مطالب
تعریف دیتافریم
دیتافریم یک ساختار داده جدولی است که به شما اجازه میدهد دادهها را بهشکلی منظم و قابل فهم، شبیه به یک جدول، مدیریت و تحلیل کنید. درک صحیح اینکه دیتافریم چیست، اولین و مهمترین قدم برای شروع کار با دیتافریم و تسلط بر ابزارهایی مانند کتابخانه Pandas در پایتون است.
تعریف ساده دیتافریم
فریم داده چیست؟ سادهترین راه برای فهم آن این است که یک صفحه گسترده (Spreadsheet) در نرمافزار اکسل را تصور کنیم. دیتافریم دقیقاً همان ساختار جدولی را دارد. این شباهت هم اتفاقی نیست. دیتافریم طراحی شده تا کار با دادههای ساختاریافته را که معمولاً در فایلهای CSV یا جداول پایگاه داده یافت میشوند، بصری، ساده و قدرتمند کند.
تعریف فنی دیتافریم
از دیدگاه فنی، دیتافریم یک ساختار داده دوبعدی، تغییرپذیر (Mutable) و با ستونهایی بالقوه ناهمگون (Heterogeneous) است. بیایید اجزای این تعریف را بررسی کنیم:
- دوبعدی (2-Dimensional): دادهها در دو محور سطر و ستون سازماندهی میشوند.
- تغییرپذیر (Mutable): شما میتوانید پساز ایجاد دیتافریم، اندازه و محتوای آن را تغییر دهید؛ مثلاً ستونی را حذف یا سطری را اضافه کنید.
- ستونهای ناهمگون (Heterogeneous Columns): این یکی از ویژگیهای کلیدی دیتافریم است. برخلاف آرایههای NumPy که تمام عناصرشان باید از یک نوع باشند، در یک دیتافریم هر ستون میتواند نوع داده متفاوتی داشته باشد. برای مثال، ستون «نام» میتواند از نوع رشته (String)، ستون «سن» از نوع عدد صحیح (Integer) و ستون «موجودی» از نوع اعشاری (Float) باشد.
بهخاطر این ویژگیها است که تحلیل داده با دیتافریم در دنیای واقعی اینقدر مورداستقبال قرار گرفته است؛ چون ابزاری است که دادهها در آن بهندرت از یک نوع واحد تشکیل شدهاند.
چرا از دیتافریم استفاده میکنیم؟
تا اینجا دیدم که dataframe چیست و با ساختار آن آشنا شدیم. اما پرسش مهمتر این است که چرا این ساختار داده به ابزار اصلی تحلیلگران داده تبدیل شدهاست؟ چرا بهجای استفاده از لیستها یا دیکشنریهای خود پایتون، به سراغ دیتافریم میرویم؟ پاسخ این پرسش بهدلیل سه مزیت آن است: سرعت، انعطافپذیری و قدرت. درک این مزایا به شما نشان میدهد که تحلیل داده با دیتافریم چگونه میتواند فرایندهای کاری شما را متحول کند.
سرعت پردازش خیرهکننده با عملیات برداری (Vectorization)
این مهمترین دلیلی است که نشان میدهد که چطور دیتافریم سرعت پردازش دادهها را افزایش میدهد. در برنامهنویسی سنتی با پایتون، برای انجام یک عملیات روی مجموعهای از دادهها (مثلاً ضرب تمام اعداد یک لیست در ۲)، باید از یک حلقه for استفاده کنید که هربار یک عنصر را پردازش میکند. این روش برای دادههای بزرگ بسیار کند و ناکارآمد است.
در این موارد است که عملیات برداری (Vectorization) مورداستفاده قرار میگیرد. دیتافریمها (که از کتابخانه NumPy قدرت میگیرند) به شما اجازه میدهند یک عملیات را بهصورت همزمان روی کل یک ستون یا آرایه از دادهها اجرا کنید، بدون اینکه نیازی به نوشتن حلقه باشد.
این سرعت شگفتانگیز به این دلیل است که این عملیاتها مستقیماً در لایههای زیرین و بهینهشده کتابخانه که با زبانهای سریعتری مانند C نوشته شدهاند، اجرا میشوند و از سربار مفسر پایتون برای هر عنصر جلوگیری میکنند. در نتیجه، محاسبات روی میلیونها سطر داده در کسری از ثانیه انجام میشود.
انعطافپذیری در نگهداری انواع داده
همانطورکه قبلاً در دیتافریم چیست اشاره شد، دیتافریمها در نگهداری ستونهایی با انواع داده متفاوت (متن، عدد، تاریخ و…) بسیار انعطافپذیر هستند. این ویژگی در دنیای واقعی که دیتاستها تقریباً همیشه ترکیبی از انواع مختلف داده هستند، یک مزیت حیاتی است. شما نیازی به ساختارهای داده جداگانه برای هر نوع اطلاعات ندارید و میتوانید تمام ویژگیهای یک مشاهده را در یک سطر واحد و در یک ساختار یکپارچه نگهداری کنید. این ویژگی، مراحل پاکسازی و آمادهسازی داده را به مراتب سادهتر میکند.
مجموعهای غنی از توابع آماده برای تحلیل داده
کار با دیتافریم به معنای دسترسی به اقیانوسی از توابع و متدهای ازپیشآمادهشده برای تقریباً هر نوع عملیات تحلیل داده است. بهجای اینکه شما مجبور باشید الگوریتمهای پیچیده را از صفر پیادهسازی کنید، کتابخانهای مانند Pandas این ابزارها را در اختیار شما قرار میدهد. مثلاً ابزارهایی مانند جدول زیر:
عملیات موردنیاز | تابع معادل در Pandas |
---|---|
محاسبه میانگین یک ستون | df[‘column’].mean() |
گروهبندی دادهها براساس یک ستون | df.groupby(‘column’) |
ادغام دو دیتافریم با یکدیگر | pd.merge(df1, df2) |
خواندن یک فایل اکسل | pd.read_excel(‘file.xlsx’) |
مدیریت دادههای خالی | df.dropna() یا df.fillna() |
این توابع آماده باعث صرفهجویی فوقالعاده در زمان میشوند و چون توسط متخصصان نوشته و بهینه شدهاند، ازنظر عملکرد و دقت نیز قابلاعتماد هستند و احتمال بروز خطا در کدهای شما را کاهش میدهند.
اجزای اصلی یک دیتافریم
هر دیتافریم از سه جزء اصلی تشکیل شدهاست که درک آنها برای دستکاری و کار با دادهها ضروری است. حالا ببینیم که اجزای اصلی دیتافریم چیست.
۱- ستونها (Columns)
ستونها محور عمودی دیتافریم هستند و هر کدام یک متغیر یا ویژگی از مجموعه داده شما را نمایندگی میکنند. در کتابخانه Pandas، هر ستون از یک دیتافریم، خود یک ساختار داده دیگر به نام سری (Series) است. به همین دلیل میتوان روی هر ستون بهصورت مستقل عملیات ریاضی یا منطقی انجام داد.
۲- سطرها (Rows)
سطرها محور افقی دیتافریم هستند و هر سطر نمایانگر یک مشاهده یا نمونه واحد در دادهها است. برای مثال، در یک دیتافریم از اطلاعات مشتریان، هر سطر اطلاعات کامل یک مشتری را در بر میگیرد.
۳- اندیس (Index)
اندیس، برچسب یا آدرس منحصربهفرد هر سطر است. این بخش یکی از قدرتمندترین ویژگیهای دیتافریم است که آن را از ساختارهای دادهای سادهتر متمایز میکند. بهطور پیشفرض، اندیس مجموعهای از اعداد صحیح است که از صفر شروع میشود (0, 1, 2, …). اما شما میتوانید هر ستونی را که دارای مقادیر منحصربهفرد است (مانند کد ملی، شماره دانشجویی یا تاریخ) بهعنوان اندیس دیتافریم تنظیم کنید. این کار سرعت دسترسی و انتخاب دادهها را بهشکل چشمگیری افزایش میدهد و پایهای برای عملیات پیشرفته مانند ادغام دادهها براساس یک کلید مشترک است.
آموزش کار با دیتافریم در پایتون (کتابخانه Pandas)
در اکوسیستم پایتون، ابزار استاندارد و بیرقیب برای کار با دیتافریمها، کتابخانه Pandas است. اگرچه پیشتر به سؤال «دیتافریم چیست» پاسخ دادیم، اما برای فهم بهتر آن باید در عمل از آن استفاده کنیم. برای شروع، ابتدا باید این کتابخانه را در محیط کدنویسی خود وارد (import) کنیم. این کار طبق یک قرارداد نانوشته با نام مستعار pd انجام میشود.
مقاله تکمیلی: پایتون چیست؟ راهنمای شروع سریع برای تازهکارها
import pandas as pd
تمام مثالهای ادامه مقاله با فرض اجرای این خط کد نوشته شدهاند.
چگونه یک دیتافریم بسازیم؟
ایجاد دیتافریم اولین قدم عملی در هر پروژه تحلیل دادهاست. خوشبختانه Pandas راههای متعددی برای ساخت یک دیتا فریم در پایتون از منابع داده گوناگون فراهم کردهاست. در ادامه سه روش متداول را بررسی میکنیم.
ساخت دیتافریم از یک دیکشنری (Dictionary)
این روش یکی از سادهترین و رایجترین راهها برای ساخت دیتافریمهای کوچک بهصورت دستی است. در این حالت، کلیدهای دیکشنری بهعنوان نام ستونها و مقادیر (که لیستی از دادهها هستند) بهعنوان دادههای آن ستونها درنظر گرفته میشوند.
# تعریف یک دیکشنری
data = {
'نام': ['علی', 'سارا', 'رضا', 'مریم'],
'سن': [25, 31, 28, 35],
'شهر': ['تهران', 'اصفهان', 'شیراز', 'تهران']
}
# ایجاد دیتافریم از دیکشنری
df = pd.DataFrame(data)
# نمایش دیتافریم
print(df)
خروجی:
نام سن شهر
0 علی 25 تهران
1 سارا 31 اصفهان
2 رضا 28 شیراز
3 مریم 35 تهران
ساخت دیتافریم از یک لیست (List)
شما همچنین میتوانید با استفاده از یک لیست تودرتو (لیستی از لیستها) یک دیتافریم ایجاد کنید. در این روش، هر لیست داخلی نقش یک سطر از دیتافریم را ایفا میکند. توجه داشته باشید که در این حالت باید نام ستونها را بهصورت جداگانه مشخص کنید.
# تعریف یک لیست از لیستها
rows_data = [
['علی', 25, 'تهران'],
['سارا', 31, 'اصفهان'],
['رضا', 28, 'شیراز'],
['مریم', 35, 'تهران']
]
# تعریف نام ستونها
columns_names = ['نام', 'سن', 'شهر']
# ایجاد دیتافریم از لیست
df = pd.DataFrame(rows_data, columns=columns_names)
# نمایش دیتافریم
print(df)
خروجی این کد نیز دقیقاً مشابه مثال قبلی خواهد بود.
خواندن داده از فایل CSV
در پروژههای واقعی، دادهها معمولاً در فایلهایی مانند CSV (Comma-Separated Values) ذخیره شدهاند. Pandas با تابع قدرتمند read_csv() این کار را فوقالعاده ساده کردهاست. کافی است مسیر فایل را به این تابع بدهید تا دیتافریم شما ساخته شود.
# فرض کنید فایلی به نام 'users.csv' در کنار فایل پایتون شما وجود دارد
df = pd.read_csv('users.csv')
# نمایش دیتافریم خوانده شده
print(df)
این دستور فایل users.csv را میخواند و محتویات آن را به یک دیتافریم تبدیل میکند. ردیف اول فایل CSV بهطور خودکار بهعنوان نام ستونها درنظر گرفته میشود.
مشاهده و بررسی اولیه دادهها
پساز ایجاد دیتافریم، اولین و حیاتیترین قدم، نگاهی سریع به دادهها برای درک ساختار، ابعاد و محتوای آن است. این کار به شما کمک میکند تا یک دید کلی نسبت به دیتاست خود پیدا کنید.
دستورهای head(), tail() و sample()</h4>
این سه دستور برای مشاهده نمونهای از سطرهای دیتافریم به کار میروند:
- df.head(n): n سطر اول دیتافریم را نمایش میدهد (مقدار پیشفرض n برابر 5 است). این دستور برای دیدن شروع دادهها عالی است.
- df.tail(n): n سطر آخر دیتافریم را نمایش میدهد. برای اطمینان از اینکه تمام دادهها بهدرستی بارگذاری شدهاند کاربرد دارد.
- df.sample(n): n سطر را بهصورت تصادفی از کل دیتافریم انتخاب و نمایش میدهد. این دستور برای دیدن یک نمونه بدون سوگیری (مثلاً در دیتافریمهای مرتبشده) بسیار مفید است.
# با استفاده از دیتافریمی که از دیکشنری ساختیم
print("--- Head ---")
print(df.head(2))
print("\n--- Tail ---")
print(df.tail(2))
print("\n--- Sample ---")
print(df.sample(1))
خروجی:
--- Head ---
نام سن شهر
0 علی 25 تهران
1 سارا 31 اصفهان
--- Tail ---
نام سن شهر
2 رضا 28 شیراز
3 مریم 35 تهران
--- Sample ---
نام سن شهر
1 سارا 31 اصفهان
(نتیجه sample ممکن است در هر بار اجرا متفاوت باشد)
دستورهای info() و describe()
این دو دستور اطلاعاتی خلاصهشده و بسیار کاربردی از دیتافریم ارائه میدهند:
- df.info(): یک نمای کلی از ساختار دیتافریم نمایش میدهد: تعداد سطرها، تعداد ستونها، نام و نوع داده (Dtype) هر ستون و تعداد مقادیر غیرخالی (non-null) در هر ستون. این دستور برای شناسایی مقادیر گمشده (Missing Values) و بررسی نوع دادهها ضروری است.
- df.describe(): یک خلاصه آماری برای ستونهای عددی دیتافریم محاسبه و نمایش میدهد. این آمار شامل تعداد، میانگین، انحراف معیار، کمینه، بیشینه و چارکها (Quartiles) است و به شما درک سریعی از توزیع دادههای عددی میدهد.
# نمایش اطلاعات ساختاری
print("--- Info ---")
df.info()
print("\n--- Describe ---")
# نمایش خلاصه آماری
print(df.describe())
خروجی:
--- Info ---
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 4 entries, 0 to 3
Data columns (total 3 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 نام 4 non-null object
1 سن 4 non-null int64
2 شهر 4 non-null object
dtypes: int64(1), object(2)
memory usage: 224.0+ bytes
--- Describe ---
سن
count 4.000000
mean 29.750000
std 4.500000
min 25.000000
25% 27.250000
50% 29.50000f0
75% 32.000000
max 35.000000
انتخاب، فیلتر و دستکاری دادهها
اکنون که میدانید چگونه دیتافریم خود را بسازید و یک نگاه کلی به آن بیندازید، زمان آن رسیده که یاد بگیرید چگونه بخشهای مشخصی از داده را استخراج کنید. کار با دیتافریم بدون تسلط بر روشهای انتخاب و فیلتر کردن دادهها تقریباً غیرممکن است.
انتخاب ستونها و سطرها با loc و iloc
Pandas دو روش اصلی برای انتخاب دادهها دارد که در ابتدا ممکن است کمی سخت بهنظر برسند، اما تفاوت بسیار سادهای دارند:
- df.loc[] (انتخاب براساس برچسب – Label): از این دستور زمانی استفاده میکنید که میخواهید دادهها را براساس نام اندیس و نام ستون انتخاب کنید. فکر کنید دارید فردی را با نامش صدا میزنید.
- df.iloc[] (انتخاب براساس موقعیت – Integer Location): از این دستور زمانی استفاده میکنید که میخواهید دادهها را براساس موقعیت عددی (از صفر شروع میشود) انتخاب کنید. مانند آن است که فردی را با شمارهاش در صف صدا بزنید.
(اینفوگرافیک: تصویری که یک دیتافریم را نشان میدهد. یک فلش با برچسب loc به نام یک سطر و نام یک ستون (مثلاً ‘سارا’, ‘سن’) اشاره میکند. فلش دیگری با برچسب iloc به موقعیت عددی همان سلول (مثلاً [1, 1]) اشاره میکند. عنوان: تفاوت loc و iloc)
بیایید با استفاده از دیتافریم قبلی، چند مثال را ببینیم. ابتدا اندیس را روی ستون «نام» تنظیم میکنیم تا قدرت loc بهتر مشخص شود.
# df همان دیتافریم قبلی است
df = df.set_index('نام')
# --- استفاده از loc ---
# انتخاب سطر مربوط به 'سارا'
print("--- loc[سارا] ---")
print(df.loc['سارا'])
# انتخاب مقدار سن برای 'رضا'
print("\n--- loc[رضا, سن] ---")
print(df.loc['رضا', 'سن'])
# --- استفاده از iloc ---
# انتخاب اولین سطر (موقعیت 0)
print("\n--- iloc[0] ---")
print(df.iloc[0])
# انتخاب مقدار در سطر دوم، ستون اول (موقعیت 1, 0)
print("\n--- iloc[1, 0] ---")
print(df.iloc[1, 0])
خروجی:
--- loc[سارا] ---
سن 31
شهر اصفهان
Name: سارا, dtype: object
--- loc[رضا, سن] ---
28
--- iloc[0] ---
سن 25
شهر تهران
Name: علی, dtype: object
--- iloc[1, 0] ---
31
فیلتر کردن دادهها براساس شروط منطقی
یکی از پرکاربردترین قابلیتها در تحلیل داده با دیتافریم همین است. شما میتوانید به سادگی سطرهایی را انتخاب کنید که یک یا چند شرط خاص را برآورده میکنند.
# دیتافریم را به حالت اولیه برمیگردانیم
df = df.reset_index()
# انتخاب افرادی که سن آنها بیشتر از 30 است
print("--- سن > 30 ---")
print(df[df['سن'] > 30])
# انتخاب افرادی که اهل تهران هستند و سنشان کمتر از 30 است
print("\n--- اهل تهران و سن < 30 ---")
print(df[(df['شهر'] == 'تهران') & (df['سن'] < 30)])
خروجی:
--- سن > 30 ---
نام سن شهر
1 سارا 31 اصفهان
3 مریم 35 تهران
--- اهل تهران و سن < 30 ---
نام سن شهر
0 علی 25 تهران
افزودن و حذف ستونها
تغییر ساختار دیتافریم با افزودن ستونهای جدید (مثلاً برای نگهداری نتایج یک محاسبه) یا حذف ستونهای غیرضروری، بسیار سادهاست.
# افزودن یک ستون جدید برای وضعیت اشتغال
df['شاغل'] = [True, False, True, True]
# افزودن ستون 'سال تولد' براساس محاسبه روی ستون 'سن'
df['سال تولد'] = 2024 - df['سن']
print("--- پس از افزودن ستونها ---")
print(df)
# حذف ستون 'شاغل'
df = df.drop('شاغل', axis=1)
print("\n--- پس از حذف ستون 'شاغل' ---")
print(df)
نکته مهم: پارامتر axis=1 به متد drop میگوید که باید به دنبال یک ستون برای حذف بگردد. اگر این پارامتر را مشخص نکنید (یا axis=0 قرار دهید)، Pandas تلاش میکند یک سطر با آن نام را حذف کند.
مهمترین عملیات روی دیتافریم
علاوهبر انتخاب و فیلتر، مجموعهای از عملیات برای تبدیل، خلاصهسازی و مرتبسازی دادهها وجود دارد که در ادامه به مهمترین آنها میپردازیم.
مرتبسازی دادهها (Sorting)
شما میتوانید دیتافریم خود را بهراحتی و براساس مقادیر یک یا چند ستون با استفاده از متد sort_values() مرتب کنید.
# مرتبسازی بر اساس سن به صورت صعودی
df_sorted_asc = df.sort_values(by='سن')
print("--- مرتبسازی صعودی بر اساس سن ---")
print(df_sorted_asc)
# مرتبسازی براساس سن بهصورت نزولی
df_sorted_desc = df.sort_values(by='سن', ascending=False)
print("\n--- مرتبسازی نزولی براساس سن ---")
print(df_sorted_desc)
مدیریت دادههای گمشده (Missing Values)
دادههای دنیای واقعی اغلب ناقص هستند و مقادیر خالی یا گمشده (NaN – Not a Number) دارند. Pandas ابزارهای قدرتمندی برای مدیریت این مقادیر ارائه میدهد. ابتدا یک مقدار گمشده به دیتافریم خود اضافه میکنیم:
import numpy as np
df.loc[1, 'سال تولد'] = np.nan # اضافه کردن یک مقدار NaN
print("--- دیتافریم با مقدار گمشده ---")
print(df)
# حذف تمام سطرهایی که حداقل یک مقدار گمشده دارند
df_dropped = df.dropna()
print("\n--- پس از حذف سطرهای گمشده (dropna) ---")
print(df_dropped)
# جایگزینی مقادیر گمشده با عدد صفر
df_filled = df.fillna(0)
print("\n--- پس از جایگزینی با صفر (fillna) ---")
print(df_filled)
حذف (dropna) یا جایگزینی (fillna) آن به استراتژی شما و ماهیت دادهها بستگی دارد.
گروهبندی و تجمیع دادهها (Grouping and Aggregation)
یکی از قدرتمندترین قابلیتهای Pandas است که به شما امکان میدهد عملیاتی مشابه GROUP BY در SQL یا PivotTables در اکسل انجام دهید. این فرایند شامل سه مرحله است: تقسیم دادهها به گروههای مختلف، اعمال یک تابع روی هر گروه و ترکیب نتایج در یک ساختار جدید.
برای مثال، بیایید میانگین سن را به تفکیک هر شهر محاسبه کنیم:
# گروهبندی بر اساس ستون 'شهر' و محاسبه میانگین 'سن' برای هر گروه
average_age_by_city = df.groupby('شهر')['سن'].mean()
print("--- میانگین سن به تفکیک شهر ---")
print(average_age_by_city)
خروجی:
--- میانگین سن به تفکیک شهر ---
شهر
اصفهان 31.0
تهران 30.0
شیراز 28.0
Name: سن, dtype: float64
این دستور به سادگی به ما میگوید که میانگین سنی افراد ساکن تهران در این دیتاست، 30 سال است. این نوع عملیات، سنگ بنای بسیاری از تحلیلهای آماری و هوش تجاری است.
دیتافریم فقط برای پایتون نیست
اگرچه کتابخانه Pandas در پایتون، مفهوم دیتافریم را به شهرت جهانی رساند، اما در پاسخ به دیتافریم چیست فقط به این اکوسیستم محدود نیستیم. این ساختار داده بهدلیل کارایی و سادگی، بهعنوان استاندارد کاری در ابزارها و زبانهای برنامهنویسی دیگر نیز جایگاه ویژهای دارد.
کاربرد دیتافریم در زبان R
زبان R که بهطور تخصصی برای محاسبات آماری و تحلیل داده توسعه یافته، یکی از اولین میزبانان این ساختار داده بود. در واقع data.frame یکی از ساختارهای داده اصلی و داخلی (Built-in) در زبان R است، برخلاف پایتون که دیتافریم ازطریق یک کتابخانه جانبی (Pandas) به آن اضافه میشود. دیتافریم در R نیز دقیقاً همان مفهوم را دنبال میکند: یک ساختار جدولی دوبعدی که ستونهای آن میتوانند انواع داده متفاوتی داشته باشند و ابزاری خوبی برای مدلسازی آماری و مصورسازی دادهها است.
دیتافریم در Apache Spark برای دادههای کلان
ما تاکنون در دیتافریم چیست درباره پروژههای معمولی صحبت کردیم. اما وقتی حجم دادهها از چند گیگابایت بیشتر میشوند و به مقیاس ترابایت و پتابایت میرسند، ابزارهایی مانند Pandas که روی یک ماشین واحد اجرا میشوند، کارایی خود را از دست میدهند. در این پروژهها از Apache Spark استفاده میشود. اسپارک یک فریمورک پردازش توزیعشده برای دادههای کلان (Big Data) است و یکی از ساختارهای داده اصلی آن نیز دیتافریم نام دارد.
تفاوت کلیدی دیتافریم اسپارک با پانداس در معماری آن است:
- دیتافریم Pandas: یک مجموعه داده متمرکز است که باید بهطور کامل در حافظه RAM یک کامپیوتر جای بگیرد.
- دیتافریم Spark: یک مجموعه داده توزیعشده (Distributed) است که بین حافظه و دیسک دهها یا صدها کامپیوتر در یک کلاستر تقسیم میشود.
این معماری توزیعشده به اسپارک اجازه میدهد تا تحلیلهایی را روی حجم عظیمی از دادهها اجرا کند که پردازش آنها با Pandas غیرممکن است. نکته جالب اینجا است که API (رابط برنامهنویسی) دیتافریم اسپارک عمداً شبیه به Pandas طراحی شده تا متخصصان داده بتوانند به راحتی مهارتهای خود را به دنیای دادههای کلان منتقل کنند.
تفاوت دیتافریم با ساختارهای دیگر پایتون
برای درک کامل پاسخ سؤال دیتافریم چیست، بسیار مهم است که بدانیم این ساختار داده چه برتریهایی نسبت به ساختارهای داخلی خود پایتون مانند لیستها و دیکشنریها دارد. اگرچه میتوان دادههای جدولی را با یک لیست تودرتو یا یک دیکشنری نیز نمایش داد، اما دیتافریم (بهویژه در کتابخانه Pandas) برای تحلیل داده بهینهسازی شده است.
دیتافریم در پایتون درمقابل لیست تودرتو (List of Lists)
ویژگی | لیست تودرتو | دیتافریم (Pandas) |
---|---|---|
ساختار | مجموعهای از لیستها که هر کدام یک سطر را نشان میدهند. ستونها نام ندارند و فقط با اندیس عددی قابل دسترسی هستند. | ساختاری کاملاً جدولی با سطرها و ستونهای نامگذاری شده (Labeled) که خوانایی و دسترسی را بسیار سادهتر میکند. |
عملکرد | عملیات روی دادهها نیازمند نوشتن حلقههای for است که برای حجم زیاد داده بسیار کند عمل میکند. | از عملیات برداری (Vectorization) پشتیبانی میکند که سرعت پردازش دادهها را صدها برابر افزایش میدهد. |
کارایی | برای ذخیرهسازی ساده دادهها مناسب است، اما هیچ تابع آمادهای برای تحلیل (مانند محاسبه میانگین یا گروهبندی) ندارد. | دارای صدها تابع و متد آماده برای انواع عملیات تحلیل داده با دیتافریم، از پاکسازی تا مصورسازی است. |
دیتافریم در پایتون درمقابل دیکشنری (Dictionary)
ویژگی | دیکشنری | دیتافریم (Pandas) |
---|---|---|
ساختار | ساختاری کلید-مقدار (Key-Value) که میتوان از آن برای نمایش یک سطر داده یا حتی کل جدول استفاده کرد، اما فاقد ساختار ذاتی دوبعدی و منظم است. | یک ساختار کاملاً دوبعدی و بهینهسازی شده برای دادههای جدولی است که هم برای دسترسی ستونی و هم سطری کارآمد است. |
عملکرد | برای دسترسی به یک مقدار خاص ازطریق کلید، بسیار سریع است، اما برای انجام عملیات روی تمام مقادیر (مانند یک ستون) کارآمد نیست. | برای عملیات ستونی (Column-wise operations) که اساس کار با دیتافریم است، بهینهسازی شده و عملکرد فوقالعادهای دارد. |
کارایی | برای ذخیره تنظیمات یا یک رکورد واحد داده عالی است، اما ابزارهای تحلیلی ندارد. | برای ایجاد دیتافریم از منابع مختلف (مانند فایل CSV یا دیکشنری) و انجام تحلیلهای آماری پیچیده، بهترین ابزار است. |
بهطور خلاصه، بااینکه لیستها و دیکشنریها ابزارهای عمومی و قدرتمندی در پایتون هستند، فریم داده یا دیتافریم، یک ابزار تخصصی و بهینهسازی شده برای علم داده است که سرعت، قدرت و انعطافپذیری بینظیری را برای کار با دادههای ساختاریافته فراهم میکند.
چالش های دیتافریم
چالشهای کار با دیتافریم چیست و چه زمانی به مشکل میخوریم؟ باید گفت که با وجود تمام مزایا، دیتافریم (بهخصوص پیادهسازی آن در Pandas) راهی برای پایان دادن به همه مسائل نیست. هر ابزار قدرتمندی، محدودیتهای خود را دارد و شناخت این محدودیتها وجه تمایز یک متخصص حرفهای از یک کاربر تازهکار است. کار با دیتافریم در سناریوهای خاصی میتواند چالشبرانگیز و حتی ناممکن باشد.
۱- محدودیت حافظه (RAM) در کار با دادههای حجیم
بزرگترین و شناختهشدهترین محدودیت Pandas این است: کل دیتاست شما باید در حافظه RAM کامپیوترتان جای بگیرد. این یعنی اگر شما یک کامپیوتر با ۱۶ گیگابایت RAM دارید، نمیتوانید یک فایل CSV با حجم ۳۰ گیگابایت را مستقیماً در یک دیتافریم Pandas بارگذاری کنید. در عمل، این محدودیت حتی سختگیرانهتر است، زیرا Pandas برای انجام عملیات مختلف به فضایی چند برابر حجم اصلی داده در حافظه نیاز دارد. این چالش، استفاده از Pandas برای پروژههای دادههای واقعاً بزرگ را غیرممکن میسازد.
۲- کندی در عملیات غیربرداری (Non-Vectorized)
همانطور که دیدیم، قدرت Pandas در عملیات برداری است. اما گاهی منطق موردنیاز شما آنقدر پیچیده است که نمیتوان آن را در قالب یک عملیات برداری استاندارد بیان کرد. در این مواقع، برنامهنویسان به استفاده از حلقهها یا متد .apply() روی میآورند که یک تابع دلخواه را روی هر سطر دیتافریم اجرا میکند.
این کار به منزله خروج از بزرگراه سریع و بهینه C و ورود به جاده خاکی و کُند پایتون است. با انجام این کار، تمام مزیت عملکردی Pandas از بین میرود و سرعت پردازش به شدت افت میکند؛ زیرا دادهها یکییکی از محیط بهینه به مفسر پایتون منتقل و پردازش میشوند.
چالش | توضیح مختصر | چه زمانی رخ میدهد؟ |
---|---|---|
محدودیت حافظه (In-Memory) | کل دیتاست باید در RAM یک ماشین قرار گیرد. | هنگام کار با فایلهای داده بزرگتر از ظرفیت RAM موجود. |
پردازش تکهستهای (Single-Core) | اکثر عملیات Pandas از تمام هستههای CPU استفاده نمیکنند. | در محاسبات سنگین و طولانی که قابلیت موازیسازی دارند. |
سربار تکرار (Iteration Overhead) | استفاده از حلقهها یا apply() بسیار کندتر از عملیات برداری است. | زمانی که نیاز به اجرای یک تابع پیچیده و سفارشی روی هر سطر باشد. |
راهکار رفع محدودیتهای دیتافریم
همانطور که دیدیم، بزرگترین چالش در کار با دیتافریمهای حجیم، محدودیت حافظه RAM در کامپیوتر شخصی است. زمانی که حجم دادهها از ظرفیت سختافزار شما فراتر میرود، حتی بهینهترین کدها نیز با کندی و خطا مواجه میشوند. در این شرایط است که راهحل، دیگر در بهینهسازی کد نیست، بلکه در ارتقای زیرساختی است که کد روی آن اجرا میشود.
راهکار مدرن برای این چالش، استفاده از رایانش ابری است. در این روش، بهجای سرمایهگذاری سنگین برای خرید یک سیستم قدرتمند، شما ازطریق اینترنت به یک «ایستگاه کاری مجازی» در یک دیتاسنتر متصل میشوید که به منابع پردازشی (CPU) و حافظه (RAM) بسیار بالایی مجهز است.
محیطهای توسعه تعاملی مانند ژوپیتر لب، زمانی که روی چنین زیرساخت قدرتمندی اجرا میشوند، به ابزاری ایدئال برای تحلیل داده با دیتافریمهای بزرگ تبدیل میشوند.
برای آشنایی کامل با کاربردها و امکانات ژوپیتر لب، پیشنهاد میکنیم که مقاله زیر را مطالعه فرمایید.
این ترکیب به شما اجازه میدهد:
- دیتافریمهایی با دهها گیگابایت حجم را بهراحتی پردازش کنید.
- محاسبات سنگین و زمانبر را روی سرور اجرا کرده و لپتاپ خود را برای کارهای دیگر استفاده کنید.
- از هرکجا و با هر دستگاهی به محیط کاری و پروژههای خود دسترسی داشته باشید.
ابر فردوسی یکی از ارائهدهندگان پیشرو این سرویس در ایران است که به تحلیلگران داده اجازه میدهد بدون دغدغه سختافزار، تمام قدرت کتابخانههایی مانند Pandas را برای پروژههای بزرگ به خدمت بگیرند. شما همین الان میتوانید در ابر فردوسی ثبتنام کنید و ۱۰۰ هزارتومان اعتبار رایگان از ما هدیه بگیرید.
جمعبندی
به پایان بررسی دیتافریم چیست رسیدیم. ما با هم از تعریف ساده و قابل درک دیتافریم شروع کردیم، دیدیم که چطور عملیات برداری به آن قدرتی خیرهکننده برای پردازش سریع دادهها میدهد و سپس بهصورت عملی یاد گرفتیم که چگونه با استفاده از کتابخانه Pandas در پایتون، دیتافریم بسازیم، آن را بررسی کنیم، دادههای مورد نظرمان را فیلتر و انتخاب کنیم و با عملیات قدرتمندی مانند groupby به دل دادهها نفوذ کنیم.
مهمتر از همه، ما یاد گرفتیم که حرفهای فکر کنیم؛ یعنی محدودیتهای ابزارمان را بشناسیم و بدانیم چه زمانی دادههای ما آنقدر بزرگ میشوند که باید از قدرت سرورهای ابری برای پردازش آنها کمک بگیریم.
حالا نوبت شماست. ما دوست داریم تجربیات و سؤالات شما را بشنویم. آیا تابهحال در پروژهای از دیتافریم استفاده کردهاید؟ چه چالش یا نکته جالبی برایتان داشته است؟ بیایید این صفحه را به محلی برای یادگیری جمعی تبدیل کنیم.
سؤالات متداول
دیتافریم چیست؟
یک ساختار داده دوبعدی و جدولی (شبیه به یک صفحه اکسل) برای نگهداری دادهها در قالب سطر و ستون است. این ساختار به شما اجازه میدهد ستونهایی با انواع داده متفاوت (مانند عدد، متن و تاریخ) داشته باشید و ابزار اصلی برای تحلیل داده در کتابخانههایی مانند Pandas است.
چطور دیتافریم سرعت پردازش دادهها را افزایش میدهد؟
عامل اصلی سرعت دیتافریم، استفاده از عملیات برداری (Vectorization) است. بهجای پردازش دادهها در حلقههای کند پایتون، عملیات بهصورت یکجا روی کل ستونها و در لایههای بهینهشدهای که با زبان C نوشته شدهاند، اجرا میشود. این کار سربار پردازشی را بهشدت کاهش میدهد.
کتابخانه اصلی برای کار با دیتافریم در پایتون کدام است؟
کتابخانه Pandas ابزار استاندارد و اصلی برای ایجاد، مدیریت و تحلیل دیتافریمها در اکوسیستم پایتون است.
تفاوت اصلی بین loc و iloc در پانداس چیست؟
تفاوت کلیدی در روش دسترسی به دادهها است:
loc: براساس برچسب (Label) یا نام اندیس و ستون کار میکند.
iloc: براساس موقعیت عددی (Integer Position) که از صفر شروع میشود کار میکند
چه زمانی باید بهجای Pandas از ابزارهای دیگری مانند Spark استفاده کرد؟
زمانی که حجم دادههای شما آنقدر زیاد است که در حافظه RAM یک کامپیوتر واحد جای نمیگیرد. Pandas یک ابزار In-Memory است، اما Spark برای پردازش توزیعشده دادههای کلان (Big Data) روی چندین ماشین طراحی شدهاست.
آیا دیتافریم فقط برای دادههای عددی است؟
خیر. یکی از بزرگترین مزایای دیتافریم، قابلیت نگهداری ستونهایی با انواع داده ناهمگون (Heterogeneous) است. شما میتوانید در یک دیتافریم ستونهایی از نوع عدد صحیح، اعشاری، رشته (متن)، تاریخ، بولین (True/False) و… داشته باشید.