شروع کار با پانداس و بارگذاری داده
پانداس دو ساختار اصلی دارد: Series (یک ستون) و DataFrame (جدول). نصب آن با pip install pandas انجام میشود و مستندات رسمی در pandas.pydata.org/docs است. در این مقاله از یک فایل فروش ساده استفاده میکنیم؛ اگر فایل ندارید، همین داده را درون کد میسازیم تا همهی مثالها اجراشدنی باشند.
import pandas as pd
# In real work: df = pd.read_csv("sales.csv", parse_dates=["date"])
df = pd.DataFrame({
"date": ["2026-01-03", "2026-01-15", "2026-02-02", "2026-02-20", "2026-03-05", "2026-03-18"],
"city": ["Tabriz", "Tehran", "Tabriz", None, "Tehran", "Tabriz"],
"product": ["rug", "rug", "kilim", "rug", "kilim", "rug"],
"qty": [2, 1, 3, 1, None, 4],
"price": [1200, 1500, 800, 1500, 800, 1200],
})
df["date"] = pd.to_datetime(df["date"])
print(df.shape)
print(df.dtypes)
print(df.head())برای فایلهای فارسی، رمزگذاری را بررسی کنید: pd.read_csv("file.csv", encoding="utf-8-sig") معمولاً مشکل فایلهای خروجی اکسل را حل میکند. فایلهای بزرگ را با usecols و dtype سبکتر بخوانید.
شناخت داده پیش از تحلیل
پیش از هر محاسبه، چند دستور ثابت را اجرا کنید. این کار چند دقیقه طول میکشد و جلوی نتیجهگیری غلط از دادهی خراب را میگیرد:
df.info(): نوع ستونها و تعداد مقدارهای غیرخالی.df.describe(): میانگین، کمینه و بیشینه؛ مقدارهای غیرمنطقی (قیمت منفی) را نشان میدهد.df.isna().sum(): تعداد مقدار گمشده در هر ستون.df["city"].value_counts(dropna=False): مقدارهای تکراری و غلطهای املایی در ستونهای دستهای.df.duplicated().sum(): ردیفهای تکراری.
پاکسازی داده: مقدار گمشده، نوع و تکراری
پاکسازی تصمیمگیری است، نه فقط دستور. حذف ردیف، پر کردن با میانگین یا نگهداشتن «نامشخص» هر کدام نتیجهی متفاوتی میدهد؛ تصمیم را با توجه به معنای ستون بگیرید و ثبت کنید.
clean = (
df
.drop_duplicates()
.assign(
city=lambda d: d["city"].fillna("unknown").str.strip().str.title(),
qty=lambda d: d["qty"].fillna(0).astype(int),
product=lambda d: d["product"].astype("category"),
)
.assign(revenue=lambda d: d["qty"] * d["price"])
)
print(clean)زنجیرهی بالا (method chaining) مرحلهها را بهترتیب و خوانا نگه میدارد و DataFrame اصلی را تغییر نمیدهد. توجه کنید که پر کردن تعداد گمشده با ۰ در اینجا یعنی «فروشی ثبت نشده»؛ اگر معنیاش «نامعلوم» است، بهتر است ردیف را کنار بگذارید.

گروهبندی و خلاصهسازی با groupby
بیشتر پرسشهای کسبوکار به شکل «برای هر X، مقدار Y چقدر است» هستند و پاسخشان groupby است:
by_city = (
clean.groupby("city", as_index=False)
.agg(orders=("qty", "size"), units=("qty", "sum"), revenue=("revenue", "sum"))
.sort_values("revenue", ascending=False)
)
print(by_city)
pivot = clean.pivot_table(index="city", columns="product", values="revenue",
aggfunc="sum", fill_value=0, observed=True)
print(pivot)تجمیع نامدار (name=("column", "func")) خروجی را خوانا میکند و نیازی به تغییر نام ستونها نیست. pivot_table همان کار را به شکل ماتریس درمیآورد که برای مقایسهی شهر و محصول مناسب است. اگر نتیجه را در یک گزارش وب نشان میدهید، صفحهی خدمات تحلیل داده ما نمونهی همکاریهایمان را توضیح میدهد.
ترکیب جدولها با merge
دادهی واقعی معمولاً در چند جدول است: سفارشها، مشتریان، محصولات. merge معادل JOIN در SQL است و نوع اتصال را با how تعیین میکنید.
cities = pd.DataFrame({
"city": ["Tabriz", "Tehran", "Shiraz"],
"region": ["North-West", "Centre", "South"],
})
# validate catches accidental many-to-many joins that silently multiply rows
merged = clean.merge(cities, on="city", how="left", validate="many_to_one")
print(merged[["city", "region", "revenue"]])
print(merged["region"].isna().sum(), "rows without a region")اگر دادهی شما در یک پایگاهداده است، اغلب بهتر است join سنگین را همانجا با SQL انجام دهید و فقط نتیجه را به پانداس بیاورید؛ طراحی کوئریها در طراحی API های مقیاسپذیر هم مطرح شده است.
سری زمانی: تاریخ، resample و روند
وقتی ستون تاریخ از نوع datetime باشد، گروهبندی بر اساس ماه یا هفته یک خط کد است. تبدیل نوع تاریخ را همان ابتدای کار انجام دهید، نه وسط تحلیل.
monthly = (
clean.set_index("date")["revenue"]
.resample("MS") # month start
.sum()
.to_frame("revenue")
)
monthly["change_pct"] = monthly["revenue"].pct_change() * 100
monthly["rolling_2m"] = monthly["revenue"].rolling(2).mean()
print(monthly)pct_change برای ماه اول مقدار خالی میدهد که طبیعی است. با دادهی کم، میانگین متحرک را کوتاه بگیرید و نتیجه را بیشازحد تفسیر نکنید؛ چند ماه داده برای ادعای «روند» کافی نیست.
دامهای رایج در پانداس
- حلقه روی ردیفها:
iterrows()کند است. ستون را بهصورت برداری محاسبه کنید:df["a"] * df["b"]. - SettingWithCopyWarning: روی یک برش (slice) مقدار ننویسید؛ از
.locیا.copy()استفاده کنید. - نوع ستونها: اعدادی که بهصورت رشته خوانده شدهاند جمع نمیشوند؛
pd.to_numeric(col, errors="coerce")مقدارهای خراب را بهNaNتبدیل میکند تا ببینید کجا هستند. - حافظه: ستونهای متنی تکراری را به
categoryتبدیل کنید و برای فایلهای خیلی بزرگ از خواندن تکهتکه (chunksize) استفاده کنید.
نتیجهی تحلیل معمولاً به یک نمودار یا یک فایل خروجی ختم میشود: by_city.to_csv("report.csv", index=False) یا df.plot(kind="bar") (با Matplotlib). برای انتشار روی سایت، سرعت بارگذاری صفحه را هم در نظر بگیرید.
چکلیست تحلیل تکرارپذیر و گام بعد
- دادهی خام را دستنخورده نگه دارید و پاکسازی را در کد انجام دهید.
- نوع ستونها را در همان بارگذاری تعیین کنید.
- پس از هر merge تعداد ردیفها را بررسی کنید.
- فرضها (مثلاً «گمشده یعنی ۰») را در کد بهصورت کامنت بنویسید.
- کل مراحل را در یک اسکریپت یا نوتبوک بنویسید تا با دادهی جدید دوباره اجرا شود.
پس از تسلط بر این پایه، قدم طبیعی بعد یادگیری مدلهاست؛ مقدمهای بر یادگیری ماشین از همین جدولهای تمیز شروع میشود. برای مرور اصول پایهی زبان هم مستندات پایتون مرجع خوبی است. و اگر دادهی کسبوکارتان آمادهی تحلیل است، با ما در میان بگذارید.
پرسشهای متداول
پانداس را از کجا یاد بگیرم و چقدر پایتون لازم است؟
آشنایی با متغیر، لیست، دیکشنری و تابع کافی است. با یک فایل CSV واقعی و پرسشهای مشخص شروع کنید و مستندات رسمی را کنار دست بگذارید؛ تمرین روی دادهی خودتان از دورهی صرفاً نظری مؤثرتر است.
تفاوت Series و DataFrame چیست؟
Series یک ستون داده با برچسب ردیف است و DataFrame جدولی از چند Series با ایندکس مشترک. هر ستون یک DataFrame در واقع یک Series است.
پانداس برای چه حجمی از داده مناسب است؟
برای دادهای که در حافظهی رایانه جا شود، معمولاً تا چند میلیون ردیف روی یک دستگاه معمولی. برای حجم بیشتر میتوانید ستونها را سبکتر کنید، تکهتکه بخوانید یا از پایگاهداده و ابزارهای توزیعشده کمک بگیرید.
چطور مقدارهای گمشده را مدیریت کنم؟
ابتدا با isna().sum() بشمارید، بعد بر اساس معنای ستون تصمیم بگیرید: حذف ردیف، پر کردن با مقدار ثابت یا میانه، یا نگهداشتن بهعنوان «نامشخص». تصمیم را مستند کنید.

دیدگاهها
هنوز دیدگاهی ثبت نشده است. اولین نفر باشید.