Menu
CoddyTech
flag Ar iconالعربيةdown icon

ورقة pandas المرجعية

آخر تحديث

إنشاء DataFrame

جداول DataFrame صغيرة تُبنى يدويًا للأمثلة والاختبارات وجداول البحث.

المهمةالكود
استيراد pandas و NumPyimport pandas as pd import numpy as np
من قاموس أعمدةdf = pd.DataFrame({"name": ["Ada", "Ben"], "age": [36, 28]})
من قائمة صفوفpd.DataFrame([{"name": "Ada", "age": 36}, {"name": "Ben", "age": 28}])
من مصفوفة NumPypd.DataFrame(np.arange(6).reshape(3, 2), columns=["x", "y"])
Series بتسمياتs = pd.Series([3, 5, 2], index=["a", "b", "c"])
نطاق من التواريخpd.date_range("2026-01-01", periods=7, freq="D")

قراءة الملفات وكتابتها

استدعاء واحد يحمّل الملف إلى DataFrame، واستدعاء واحد يكتبه من جديد.

المهمةالكود
قراءة ملف CSVdf = pd.read_csv("sales.csv")
أعمدة محددة فقط مع تواريخ حقيقيةpd.read_csv("sales.csv", usecols=["date", "city", "sales"], parse_dates=["date"])
استخدام عمود كفهرسpd.read_csv("sales.csv", index_col="id")
فاصل Tab أو فاصل آخرpd.read_csv("sales.tsv", sep="\t")
اعتبار علامات إضافية قيمًا مفقودةpd.read_csv("sales.csv", na_values=["n/a", "-"])
قراءة الصفوف الأولى فقطpd.read_csv("sales.csv", nrows=1000)
قراءة ورقة Excel (تتطلب openpyxl)pd.read_excel("report.xlsx", sheet_name="2026")
قراءة سجلات JSONpd.read_json("records.json")
القراءة من قاعدة بيانات SQLpd.read_sql("SELECT * FROM orders", conn)
كتابة CSV بدون الفهرسdf.to_csv("clean.csv", index=False)
الكتابة إلى Excel أو Parquetdf.to_excel("clean.xlsx", index=False), df.to_parquet("clean.parquet")

فحص البيانات

أول الاستدعاءات التي تجريها على أي مجموعة بيانات جديدة.

المهمةالكود
الصفوف الأولى والأخيرةdf.head(), df.tail(3)
عدد الصفوف والأعمدةdf.shape # (6, 7)
أنواع الأعمدة وعدد القيم غير الفارغةdf.info()
إحصاءات موجزة للأعمدة الرقميةdf.describe()
ملخص لكل الأعمدةdf.describe(include="all")
أسماء الأعمدة وأنواعهاdf.columns, df.dtypes
تكرار كل قيمةdf["city"].value_counts()
نسبة كل قيمةdf["city"].value_counts(normalize=True)
القيم المميزة وعددهاdf["city"].unique(), df["city"].nunique()
القيم المفقودة في كل عمودdf.isna().sum()
عينة عشوائية من الصفوفdf.sample(3, random_state=0)
الارتباط بين الأعمدة الرقميةdf.corr(numeric_only=True)

اختيار الأعمدة والصفوف

يختار loc حسب التسمية ويشمل نهاية الشريحة. ويختار iloc حسب الموضع ويستثنيها.

المهمةالكود
عمود واحد على شكل Seriesdf["age"]
عدة أعمدة على شكل DataFramedf[["name", "age"]]
صفوف وأعمدة حسب التسميةdf.loc[0:2, ["name", "age"]]
صفوف وأعمدة حسب الموضعdf.iloc[0:2, 0:3]
قيمة واحدةdf.at[0, "age"], df.iat[0, 3]
الصف الأخيرdf.iloc[-1]
أعمدة من نوع واحدdf.select_dtypes(include="number")
أعمدة النصوص (pandas 3)df.select_dtypes(include="str")
أعمدة حسب تطابق الاسمdf.filter(like="sal"), df.filter(regex="^(age|salary)$")
البحث عن صفوف بعمودdf.set_index("name").loc["Ada", "salary"]
العودة إلى فهرس 0، 1، 2df.reset_index(drop=True)
حذف أعمدة أو صفوفdf.drop(columns=["email"]), df.drop(index=[0, 1])

فلترة الصفوف

ضع كل شرط بين قوسين واجمع الشروط باستخدام & (و) و | (أو) و ~ (نفي).

المهمةالكود
الصفوف التي تحقق شرطًاdf[df["age"] > 30]
الشرطان معًاdf[(df["age"] > 30) & (df["city"] == "Oslo")]
أحد الشرطينdf[(df["city"] == "Oslo") | (df["salary"] > 6000)]
قيمة ضمن قائمةdf[df["city"].isin(["Oslo", "Rome"])]
قيمة خارج قائمةdf[~df["city"].isin(["Oslo", "Rome"])]
بين قيمتين، مع الطرفينdf[df["age"].between(30, 40)]
الفلترة بنص استعلامdf.query("age > 30 and city == 'Oslo'")
استخدام متغير في استعلامmin_age = 30 df.query("age > @min_age")
النص يحتوي علىdf[df["name"].str.contains("e", case=False)]
قيم مفقودة أو موجودةdf[df["age"].isna()], df[df["age"].notna()]
فلترة الصفوف واختيار الأعمدةdf.loc[df["age"] > 30, ["name", "salary"]]
أعلى أو أدنى n صفوفdf.nlargest(3, "salary"), df.nsmallest(2, "age")
صفوف بقيمة مكررةdf[df.duplicated(subset=["city"], keep=False)]

الترتيب والتصنيف

المهمةالكود
الترتيب حسب عمودdf.sort_values("salary")
الأكبر أولًاdf.sort_values("salary", ascending=False)
الترتيب حسب عدة أعمدةdf.sort_values(["city", "salary"], ascending=[True, False])
القيم المفقودة أولًاdf.sort_values("age", na_position="first")
الترتيب حسب الفهرسdf.sort_index()
تصنيف القيم، 1 للأعلىdf["salary"].rank(ascending=False)

إضافة الأعمدة وتعديلها

العمليات على العمود كاملًا سريعة. لا تلجأ إلى apply إلا عندما لا توجد دالة مدمجة تؤدي المهمة.

المهمةالكود
عمود جديد من أعمدة أخرىdf["bonus"] = df["salary"] * 0.1
إضافة عمود داخل سلسلة استدعاءاتdf.assign(bonus=lambda d: d["salary"] * 0.1)
قيمة حسب شرطdf["level"] = np.where(df["age"] >= 40, "senior", "junior")
قيمة حسب عدة شروطdf["band"] = np.select([df["age"] < 30, df["age"] < 45], ["young", "mid"], default="senior")
تغيير القيم حيث يتحقق شرطdf.loc[df["city"] == "Lima", "salary"] = 4000
ربط القيم بقاموسdf["country"] = df["city"].map({"Oslo": "NO", "Rome": "IT", "Lima": "PE"})
تطبيق دالة على عمودdf["salary"].apply(lambda x: round(x, -3))
تطبيق دالة على كل خليةdf[["age", "salary"]].map(lambda x: x / 1000)
إعادة تسمية الأعمدةdf.rename(columns={"salary": "pay"})
تغيير نوع عمودdf["salary"].astype("float64")
نص إلى أرقام، والقيم غير الصالحة إلى NaNpd.to_numeric(s, errors="coerce")
أرقام إلى فئات مسماةpd.cut(df["age"], bins=[0, 30, 45, 120], labels=["young", "mid", "senior"])
أرقام إلى مجموعات متساوية الحجمpd.qcut(df["salary"], q=4, labels=False)
المرور على الصفوف (بطيء، كحل أخير)for row in df.itertuples(): print(row.name, row.salary)

القيم المفقودة والتنظيف

تظهر الأرقام المفقودة على شكل NaN والتواريخ المفقودة على شكل NaT . كل استدعاء هنا يُرجع كائنًا جديدًا، لذا أسند النتيجة إلى متغير.

المهمةالكود
نسبة القيم المفقودة في كل عمودdf.isna().mean()
حذف الصفوف التي فيها أي قيمة مفقودةdf.dropna()
حذف الصفوف التي ينقصها عمود أساسيdf.dropna(subset=["age"])
التعبئة بقيمة لكل عمودdf.fillna({"age": df["age"].median()})
التعبئة من الصف السابق أو التاليdf["age"].ffill(), df["age"].bfill()
ملء الفجوات بالاستيفاءdf["age"].interpolate()
تحويل العلامات إلى قيم مفقودةdf.replace(["n/a", "-", ""], np.nan)
حذف الصفوف المكررةdf.drop_duplicates()
الإبقاء على آخر صف لكل مفتاحdf.drop_duplicates(subset=["city"], keep="last")
ترتيب أسماء الأعمدةdf.columns = df.columns.str.strip().str.lower().str.replace(" ", "_")
تقييد القيم المتطرفةdf["salary"].clip(lower=4000, upper=6000)
نوع category للنصوص المتكررةdf["city"] = df["city"].astype("category")

أعمدة النصوص (.str)

في pandas 3 تأخذ أعمدة النصوص نوع البيانات str افتراضيًا. تعمل دوال .str على العمود كاملًا، وتبقى القيم المفقودة مفقودة.

المهمةالكود
أحرف كبيرة أو صغيرة أو بأول حرف كبيرdf["name"].str.upper(), df["name"].str.lower(), df["name"].str.title()
إزالة المسافاتdf["name"].str.strip()
استبدال نصdf["email"].str.replace("mail.com", "example.com")
الاستبدال بتعبير نمطي (regex)df["email"].str.replace(r"@.*", "", regex=True)
يحتوي على، يبدأ بـdf["name"].str.contains("a"), df["name"].str.startswith("E")
طول كل قيمةdf["name"].str.len()
الأحرف الأولىdf["name"].str[:2]
التقسيم إلى أعمدةdf["email"].str.split("@", expand=True)
الاستخراج بمجموعة regexdf["email"].str.extract(r"@(\w+)")
دمج أعمدة النصوصdf["name"] + " (" + df["city"] + ")"
إكمال الأرقام بأصفارdf["salary"].astype("str").str.zfill(6)
نوع النصوص الجديدdf["name"].dtype # str

التواريخ والأوقات

تعمل الواجهة .dt على أعمدة التاريخ والوقت. والفهرس الزمني المرتب ( ts أدناه) يتيح التقطيع بالنص وإعادة التجميع الزمني (resampling).

المهمةالكود
تحويل عمود إلى تواريخdf["date"] = pd.to_datetime(df["date"])
التحويل بصيغة محددةpd.to_datetime(["03/01/2026", "15/01/2026"], format="%d/%m/%Y")
السنة والشهر واسم اليومdf["date"].dt.year, df["date"].dt.month, df["date"].dt.day_name()
تجميع التواريخ حسب الشهرdf["date"].dt.to_period("M")
عدد الأيام بين تاريخين(pd.Timestamp("2026-12-31") - df["date"]).dt.days
إضافة أيام أو أشهرdf["date"] + pd.Timedelta(days=30), df["date"] + pd.DateOffset(months=1)
صفوف ضمن نطاق تواريخdf[df["date"].between("2021-01-01", "2022-12-31")]
فهرس زمني يُقطَّع بالنصts = df.set_index("date").sort_index() ts.loc["2021":"2022"]
المجموع لكل شهرts["salary"].resample("ME").sum()
المتوسط الأسبوعي؛ "QE" ربع سنوي و "YE" سنويts["salary"].resample("W").mean()
متوسط متحركts["salary"].rolling(3).mean()
التغير عن الصف السابقts["salary"].diff(), ts["salary"].pct_change()
إزاحة القيم صفًا واحدًا للأسفلts["salary"].shift(1)
مجموع تراكميts["salary"].cumsum()
تعيين المناطق الزمنية وتحويلهاts.index.tz_localize("UTC").tz_convert("Europe/Oslo")

التجميع والتلخيص

تقسم groupby الصفوف حسب المفتاح، وتطبق دالة على كل مجموعة، ثم تجمع النتائج.

المهمةالكود
المتوسط لكل مجموعةdf.groupby("city")["salary"].mean()
عدة إحصاءات معًاdf.groupby("city")["salary"].agg(["mean", "max", "count"])
أعمدة نتائج بأسماءdf.groupby("city").agg(avg_pay=("salary", "mean"), people=("name", "count"))
التجميع حسب عمودينdf.groupby(["city", "team"])["salary"].sum()
إبقاء المفاتيح كأعمدةdf.groupby("city", as_index=False)["salary"].mean()
عدد الصفوف في كل مجموعةdf.groupby("city").size()
نتيجة المجموعة في كل صفdf["city_avg"] = df.groupby("city")["salary"].transform("mean")
الإبقاء على بعض المجموعات فقطdf.groupby("city").filter(lambda g: len(g) >= 2)
الصف ذو القيمة القصوى في كل مجموعةdf.loc[df.groupby("city")["salary"].idxmax()]
أعلى n صفوف في كل مجموعةdf.sort_values("salary", ascending=False).groupby("city").head(2)
ترقيم الصفوف داخل كل مجموعةdf.groupby("city").cumcount()
المرور على المجموعاتfor city, group in df.groupby("city"): print(city, len(group))
الفلترة والتجميع والترتيب في سلسلة واحدة(df.query("age > 30") .groupby("city", as_index=False) .agg(avg_pay=("salary", "mean")) .sort_values("avg_pay", ascending=False))

الجداول المحورية وإعادة التشكيل

البيانات الطويلة فيها صف واحد لكل ملاحظة. والبيانات العريضة توزّع متغيرًا واحدًا على عدة أعمدة.

المهمةالكود
جدول محوريdf.pivot_table(index="city", columns="team", values="salary", aggfunc="mean", fill_value=0)
جدول محوري مع المجاميعdf.pivot_table(index="city", values="salary", aggfunc="sum", margins=True)
عدّ التوليفاتpd.crosstab(df["city"], df["team"])
النسب في كل صفpd.crosstab(df["city"], df["team"], normalize="index")
من عريض إلى طويلlong = df.melt(id_vars="name", value_vars=["age", "salary"], var_name="field", value_name="value")
من طويل إلى عريضlong.pivot(index="name", columns="field", values="value")
مستوى الفهرس الداخلي إلى أعمدةdf.groupby(["city", "team"])["salary"].sum().unstack(fill_value=0)
صف لكل عنصر في القائمةpd.DataFrame({"id": [1, 2], "tags": [["a", "b"], ["c"]]}).explode("tags")
ترميز عمود بطريقة one-hotpd.get_dummies(df["team"], prefix="team")
تبديل الصفوف والأعمدةdf.T

دمج جداول DataFrame

تكدّس concat الجداول، وتربط merge بينها عبر أعمدة مفتاحية كما يفعل SQL.

المهمةالكود
تكديس الصفوفpd.concat([df_2025, df_2026], ignore_index=True)
وضع الجداول جنبًا إلى جنبpd.concat([left, right], axis=1)
الربط عبر عمود مفتاحيorders.merge(customers, on="customer_id", how="left")
أنواع الربطhow="inner", "left", "right", "outer"
مفاتيح بأسماء مختلفةorders.merge(users, left_on="customer_id", right_on="id")
التحقق من الربط وتحديد مصدر كل صفorders.merge(customers, on="customer_id", how="left", validate="many_to_one", indicator=True)
الربط عبر الفهرسleft.join(right, how="inner")
صفوف ليس لها مقابل في جدول آخرorders[~orders["customer_id"].isin(customers["customer_id"])]

الرسم باستخدام pandas

ترسم pandas باستخدام Matplotlib. كل استدعاء رسم يُرجع كائن ax من Matplotlib، فيمكنك متابعة تنسيقه.

المهمةالكود
مخطط خطي لسلسلةts["salary"].plot()
مخطط خطي من عمودينdf.plot(x="date", y="salary")
مخطط أعمدة لملخصdf.groupby("city")["salary"].mean().plot.bar()
أشرطة أفقية مرتبةdf["city"].value_counts().sort_values().plot.barh()
مدرج تكراريdf["salary"].plot.hist(bins=20)
مخطط انتشارdf.plot.scatter(x="age", y="salary")
مخطط صندوقي لكل مجموعةdf.boxplot(column="salary", by="city")
العنوان وتسمية المحورax = df.plot(x="date", y="salary", title="Salary") ax.set_ylabel("EUR")
عرض المخطط أو حفظهplt.show(), ax.figure.savefig("salary.png", dpi=150)

pandas 3: الصيغ القديمة وما تكتبه الآن

الكود المنسوخ من الدروس القديمة كثيرًا ما يفشل أو يُظهر تحذيرات في pandas 3. اكتب الصيغ الموجودة في عمود pandas 3 بدلًا منه.

المهمةpandas 3الصيغة القديمة
دالة على كل خليةdf.map(f)df.applymap(f)
التعبئة من الصف السابقdf.ffill()df.fillna(method="ffill")
إضافة صفوفpd.concat([df, new_rows])df.append(new_rows)
إعادة التجميع بنهاية الشهرts["salary"].resample("ME").sum()resample("M")
تواريخ بالساعةpd.date_range("2026-01-01", periods=24, freq="h")freq="H"
تعيين قيمة واحدةdf.loc[0, "age"] = 37df["age"][0] = 37
تعديل جزء مفلترhigh = df[df["salary"] > 5000] high["salary"] = 0high = df[df["salary"] > 5000].copy()
هل هذا عمود نصوص؟df["name"].dtype == "str"df["name"].dtype == object

أكواد pandas التي يحتاجها محلل البيانات كل يوم، مرتبة حسب المهمة: إنشاء البيانات وتحميلها، فحصها، اختيار الصفوف وفلترتها، إضافة الأعمدة، تنظيف القيم المفقودة، التعامل مع النصوص والتواريخ، التجميع والتلخيص، إعادة التشكيل، الدمج والرسم. كل صف مقتطف قصير يمكنك لصقه مباشرة، مع سطر واحد يشرح ما يفعله.

كل ما هنا مكتوب لإصدار pandas 3، وهو الإصدار الذي يشغّله Coddy: أعمدة النصوص تستخدم نوع البيانات الجديد str ، وخاصية Copy-on-Write مفعّلة دائمًا، والواجهات المحذوفة مثل applymap و fillna(method=...) لا تظهر إلا في جدول الصيغ القديمة. تستخدم الأمثلة جدول DataFrame باسم df فيه الأعمدة name و city و team و age و salary و date و email . هل أنت جديد على Python نفسها؟ ابدأ بـ ورقة Python المرجعية و ساحة تجربة Python، واحتفظ بأوراق NumPy و Matplotlib و scikit-learn المرجعية بجانب هذه الورقة.

الأسئلة الشائعة حول ورقة pandas المرجعية

هل ورقة pandas المرجعية هذه مجانية؟
نعم. ورقة pandas المرجعية هذه مجانية تمامًا ولا تحتاج إلى تسجيل. أضفها إلى المفضلة أو اطبعها بصيغة PDF من متصفحك، وارجع إليها متى احتجت إلى الاستدعاء الدقيق لعملية groupby أو merge أو جدول محوري.
ما إصدار pandas الذي تغطيه هذه الورقة المرجعية؟
pandas 3. أعمدة النصوص تستخدم نوع البيانات الجديد str ، وخاصية Copy-on-Write مفعّلة دائمًا، والاستدعاءات المحذوفة في pandas 3 ( applymap و fillna(method=...) و append واختصارا التردد M و H ) لا تظهر إلا في الجدول الأخير، بجانب ما تكتبه بدلًا منها. تعمل معظم المقتطفات أيضًا على pandas 2.2، باستثناء الصفوف التي تعتمد على نوع str أو على Copy-on-Write.
ما الفرق بين loc و iloc؟
يختار loc حسب التسمية: قيم الفهرس وأسماء الأعمدة، والشريحة مثل df.loc[0:2] تشمل نهايتها. أما iloc فيختار حسب الموضع الرقمي مثل قائمة Python، لذا يُرجع df.iloc[0:2] أول صفين ويستثني النهاية. استخدم loc مع شرط لفلترة الصفوف واختيار الأعمدة في خطوة واحدة: df.loc[df["age"] > 30, ["name"]] .
كيف أفلتر DataFrame بعدة شروط؟
ضع كل شرط بين قوسين واربط الشروط بـ & للعطف (و)، و | للتخيير (أو)، و ~ للنفي: df[(df["age"] > 30) & (df["city"] == "Oslo")] . الكلمتان and و or في Python لا تعملان على الأعمدة الكاملة. وفي الفلاتر الطويلة تكون الصيغة df.query("age > 30 and city == 'Oslo'") أسهل في القراءة.
ما الفرق بين merge و join و concat؟
تدمج merge جدولي DataFrame عبر أعمدة مفتاحية مثل الربط في SQL، مع how="inner" أو "left" أو "right" أو "outer" . و join اختصار يدمج عبر الفهرس. أما concat فلا تطابق المفاتيح أبدًا: بل تكدّس الجداول فوق بعضها، أو جنبًا إلى جنب مع axis=1 .
لماذا لا يغيّر الإسناد جدول DataFrame عندي؟
منذ pandas 3، تعني خاصية Copy-on-Write أن كل اختيار يتصرف كنسخة. الإسناد المتسلسل مثل df["age"][0] = 37 يغيّر كائنًا مؤقتًا ويترك df كما هو. اكتبه بدلًا من ذلك كاستدعاء loc واحد: df.loc[0, "age"] = 37 . كذلك تُرجع دوال مثل dropna و fillna كائنًا جديدًا، لذا أسند النتيجة.
هل يمكنني تشغيل كود pandas عبر الإنترنت؟
نعم. ساحة تجربة Matplotlib المجانية تشغّل Python مع pandas و NumPy و Matplotlib و scikit-learn في متصفحك، فيمكنك لصق أي مقتطف من هذه الورقة المرجعية وتشغيله دون تثبيت أي شيء. ودورة تعلم الآلة في Coddy تعلّمك pandas خطوة بخطوة، من أول DataFrame تنشئه إلى البيانات التي تغذي النموذج.
رسم توضيحي للغات البرمجة في Coddy

تعلّم Pandas مع Coddy

ابدأ الآن