Menu
CoddyTech

Pandas Cheat Sheet: דף עזר ל-pandas

עודכן לאחרונה

יצירת DataFrame

DataFrames קטנים שבונים ביד, לדוגמאות, לבדיקות ולטבלאות עזר.

משימהקוד
ייבוא 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"])
עמודה בתור indexpd.read_csv("sales.csv", index_col="id")
טאב או מפריד אחר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 בלי ה-indexdf.to_csv("clean.csv", index=False)
כתיבה ל-Excel או Parquetdf.to_excel("clean.xlsx", index=False), df.to_parquet("clean.parquet")

בדיקת הנתונים

הפקודות הראשונות שמריצים על כל dataset חדש.

משימהקוד
שורות ראשונות ואחרונות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 בוחר לפי תווית וכולל את הקצה של ה-slice. 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"]
חזרה ל-index של 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)]
סינון עם מחרוזת querydf.query("age > 30 and city == 'Oslo'")
משתנה בתוך querymin_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")
מיון לפי ה-indexdf.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 עמודות טקסט מקבלות כברירת מחדל את ה-dtype str. מתודות ה-.str עובדות על העמודה כולה, וערכים חסרים נשארים חסרים.

משימהקוד
אותיות גדולות, קטנות או Title Casedf["name"].str.upper(), df["name"].str.lower(), df["name"].str.title()
הסרת רווחיםdf["name"].str.strip()
החלפת טקסטdf["email"].str.replace("mail.com", "example.com")
החלפה עם regexdf["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)
ה-dtype החדש לטקסטdf["name"].dtype # str

תאריכים ושעות

ה-accessor .dt עובד על עמודות datetime. index ממוין של תאריכים (ts למטה) מאפשר slicing לפי טקסט ו-resampling.

משימהקוד
המרת עמודה ל-datetimedf["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")]
index של תאריכים, slicing לפי טקסט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))

Pivot ו-reshape

בנתונים ארוכים יש שורה אחת לכל תצפית. בנתונים רחבים משתנה אחד פרוס על פני כמה עמודות.

משימהקוד
Pivot tabledf.pivot_table(index="city", columns="team", values="salary", aggfunc="mean", fill_value=0)
Pivot table עם סיכומים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")
רמת index פנימית לעמודותdf.groupby(["city", "team"])["salary"].sum().unstack(fill_value=0)
שורה לכל פריט ברשימהpd.DataFrame({"id": [1, 2], "tags": [["a", "b"], ["c"]]}).explode("tags")
One-hot encoding לעמודהpd.get_dummies(df["team"], prefix="team")
החלפה בין שורות לעמודותdf.T

שילוב DataFrames

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")
סוגי joinhow="inner", "left", "right", "outer"
מפתחות עם שמות שוניםorders.merge(users, left_on="customer_id", right_on="id")
בדיקת ה-join וסימון המקור של כל שורהorders.merge(customers, on="customer_id", how="left", validate="many_to_one", indicator=True)
צירוף לפי ה-indexleft.join(right, how="inner")
שורות בלי התאמה בטבלה אחרתorders[~orders["customer_id"].isin(customers["customer_id"])]

גרפים עם pandas

pandas משרטט בעזרת Matplotlib. כל קריאת plot מחזירה ax של Matplotlib, כך שאפשר להמשיך לעצב אותו.

משימהקוד
גרף קווי של Seriests["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")
Box plot לכל קבוצה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)
Resampling לסוף חודש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 שדאטה אנליסט משתמש בו כל יום, מסודר לפי משימה: יצירה וטעינה של נתונים, בדיקה שלהם, בחירה וסינון של שורות, הוספת עמודות, טיפול בערכים חסרים, עבודה עם טקסט ותאריכים, קיבוץ ואגרגציה, reshape, מיזוג ושרטוט. כל שורה היא קטע קוד קצר שאפשר להדביק, ועוד שורה אחת שמסבירה מה הוא עושה.

הכול כאן כתוב ל-pandas 3, הגרסה ש-Coddy מריץ: עמודות טקסט מקבלות את ה-dtype החדש str, Copy-on-Write תמיד פעיל, ו-APIs שהוסרו כמו applymap ו-fillna(method=...) מופיעים רק בטבלת הצורות הישנות. הדוגמאות משתמשות ב-DataFrame בשם df עם העמודות name, city, team, age, salary, date ו-email. חדשים ב-Python עצמו? התחילו עם Python cheat sheet ועם Python playground, ושמרו את דפי העזר של NumPy, Matplotlib ו-scikit-learn לצד הדף הזה.

שאלות נפוצות על ה-Pandas Cheat Sheet

האם ה-pandas cheat sheet הזה חינמי?
כן. ה-pandas cheat sheet הזה חינמי לגמרי, בלי צורך בהרשמה. שמרו אותו במועדפים, או הדפיסו אותו ל-PDF מהדפדפן, וחזרו אליו בכל פעם שאתם צריכים את הקריאה המדויקת ל-groupby, ל-merge או ל-pivot table.
באיזו גרסה של pandas דף העזר הזה עוסק?
pandas 3. עמודות טקסט משתמשות ב-dtype החדש str, Copy-on-Write תמיד פעיל, וקריאות שהוסרו ב-pandas 3 (applymap, fillna(method=...), append, כינויי התדירות M ו-H) מופיעות רק בטבלה האחרונה, לצד מה שצריך לכתוב במקומן. כמעט כל קטע קוד רץ גם על pandas 2.2, חוץ מהשורות שמסתמכות על ה-dtype str או על Copy-on-Write.
מה ההבדל בין loc ל-iloc?
loc בוחר לפי תווית: ערכי ה-index ושמות העמודות, ו-slice כמו 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 משלב שני DataFrames לפי עמודות מפתח, כמו join ב-SQL, עם how="inner", "left", "right" או "outer". join הוא קיצור דרך שמבצע merge לפי ה-index. concat לא מתאים מפתחות בכלל: הוא מערים טבלאות זו על זו, או זו לצד זו עם axis=1.
למה ההשמה שלי לא משנה את ה-DataFrame?
מאז pandas 3, בגלל Copy-on-Write כל בחירה מתנהגת כמו עותק. השמה משורשרת כמו df["age"][0] = 37 משנה אובייקט זמני ומשאירה את df בלי שינוי. כתבו אותה כקריאת loc אחת במקום: df.loc[0, "age"] = 37. גם מתודות כמו dropna ו-fillna מחזירות אובייקט חדש, אז שמרו את התוצאה במשתנה.
אפשר להריץ קוד pandas אונליין?
כן. ה-Matplotlib playground החינמי מריץ Python עם pandas, NumPy, Matplotlib ו-scikit-learn בדפדפן, כך שאפשר להדביק כל קטע קוד מדף העזר הזה ולהריץ אותו בלי להתקין כלום. קורס ה-Machine Learning של Coddy מלמד pandas צעד אחר צעד, מה-DataFrame הראשון שלכם ועד הנתונים שמזינים מודל.
איור של שפות התכנות ב-Coddy

ללמוד Pandas עם Coddy

להתחיל