שימו לב: על מנת להריץ את התאים ב-Live Code, יש לייבא תחילה את ספרית pandas ע”י הרצת השורת הראשונה בתא למטה.
בנוסף, נגביל את הדפסת הטבלאות לחמש שורות לכל היותר ע”י שורת הקוד השניה.
import pandas as pd
pd.options.display.max_rows=5
יצירת טבלה חדשה#
הערה
במהלך כל נושא זה, נדפיס את הטבלאות באמצעות הפקודה display המציגה גרסה מעוצבת של הטבלה. פקודה זו זמינה רק במחברות jupyter.
כדי להדפיס טבלה בעורך הקוד שלכם, השתמשו בפקודה print.
כפי שציינו ביחידה הקודמת, הטיפוס DataFrame הוא מעין “הכלאה” בין רשימות ומילונים. לכן, קיימות מספר דרכים להעביר קלט המורכב מרשימות ומילונים על מנת לאתחל אובייקט DataFrame חדש. נדגים פה ארבע דרכים:
1. מילון של רשימות#
במקרה זה, כל זוג מפתח–ערך במילון משמש לבניית עמודה אחת ב־DataFrame: המפתח הוא שם העמודה, והערך הוא רשימה של כל התאים בעמודה זו לפי סדרם.
data = {'Name': ['Rick', 'Morty'], 'Age': [70, 14]}
df = pd.DataFrame(data)
display(df)
| Name | Age | |
|---|---|---|
| 0 | Rick | 70 |
| 1 | Morty | 14 |
שימו לב
המספרים המודגשים בצד ימין הם שמות השורות, ואינן חלק מהערכים בטבלה.
בברירת מחדל, שמות השורות, הוא מאותחלות אוטומטית לפי סדרת מספרים שלמים המתחילה מ0.
נסו לאתחל את שמות השורות בעצמכם באמצעות הפרמטר index
שימו לב כי כל הרשימות חייבות להיות באותו אורך, אחרת תתקבל שגיאה:
data = {'Profession': ['Scientist', 'Kid'], 'Age': [70, 14, 17]}
df = pd.DataFrame(data)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
Cell In[4], line 2
1 data = {'Profession': ['Scientist', 'Kid'], 'Age': [70, 14, 17]}
----> 2 df = pd.DataFrame(data)
File /opt/hostedtoolcache/Python/3.11.14/x64/lib/python3.11/site-packages/pandas/core/frame.py:782, in DataFrame.__init__(self, data, index, columns, dtype, copy)
776 mgr = self._init_mgr(
777 data, axes={"index": index, "columns": columns}, dtype=dtype, copy=copy
778 )
780 elif isinstance(data, dict):
781 # GH#38939 de facto copy defaults to False only in non-dict cases
--> 782 mgr = dict_to_mgr(data, index, columns, dtype=dtype, copy=copy, typ=manager)
783 elif isinstance(data, ma.MaskedArray):
784 from numpy.ma import mrecords
File /opt/hostedtoolcache/Python/3.11.14/x64/lib/python3.11/site-packages/pandas/core/internals/construction.py:503, in dict_to_mgr(data, index, columns, dtype, typ, copy)
499 else:
500 # dtype check to exclude e.g. range objects, scalars
501 arrays = [x.copy() if hasattr(x, "dtype") else x for x in arrays]
--> 503 return arrays_to_mgr(arrays, columns, index, dtype=dtype, typ=typ, consolidate=copy)
File /opt/hostedtoolcache/Python/3.11.14/x64/lib/python3.11/site-packages/pandas/core/internals/construction.py:114, in arrays_to_mgr(arrays, columns, index, dtype, verify_integrity, typ, consolidate)
111 if verify_integrity:
112 # figure out the index, if necessary
113 if index is None:
--> 114 index = _extract_index(arrays)
115 else:
116 index = ensure_index(index)
File /opt/hostedtoolcache/Python/3.11.14/x64/lib/python3.11/site-packages/pandas/core/internals/construction.py:677, in _extract_index(data)
675 lengths = list(set(raw_lengths))
676 if len(lengths) > 1:
--> 677 raise ValueError("All arrays must be of the same length")
679 if have_dicts:
680 raise ValueError(
681 "Mixing dicts with non-Series may lead to ambiguous ordering."
682 )
ValueError: All arrays must be of the same length
2. רשימה של מילונים#
כאן כל מילון מייצג שורה בודדת, וזוג מפתח-ערך מייצג תא בודד: המפתח הוא כותרת העמודה הערך הוא מה שנמצא בתא.
data = [{'Name': 'Rick', 'Age': 70}, {'Name': 'Morty', 'Age': 14}]
df = pd.DataFrame(data)
display(df)
| Name | Age | |
|---|---|---|
| 0 | Rick | 70 |
| 1 | Morty | 14 |
חשבו
מה יקרה אם יהיו מפתחות שיופיעו רק בחלק מהמילונים? בדקו את השערתכם.
# Write your code here
3. רשימה של רשימות#
כאן כל רשימה מקוננות מייצגת שורה בטבלה. בנוסף ניתן להעביר עוד 2 ארגומנטים: index וcolumns, המייצגים את שמות השורות והעמודות בהתאמה.
ages_by_name = [['Rick', 'Morty'], [70, 14]]
df = pd.DataFrame(ages_by_name, columns=['Name', 'Age'], index=["Row 1", "Row2"])
display(df)
| Name | Age | |
|---|---|---|
| Row 1 | Rick | Morty |
| Row2 | 70 | 14 |
4. טעינת טבלה מקובץ CSV (או Comma Seperated Values)#
טקסט המופיע למטה בסגול מציין קטעים המופיעים בסרטון
ניתן להיעזר בו כדי לחזור על התכנים או לעיין בהם שוב.
קובץ CSV הוא קובץ טקסט פשוט שבו הנתונים נשמרים בצורה טבלאית, כך שכל שורה מייצגת רשומה חדשה וכל ערך בתוך השורה מופרד באמצעות פסיק.
במילים אחרות, מדובר בפורמט שבו פסיקים משמשים בתור “מפרידי עמודות”, ושורות חדשות מופרדות באמצעות מעבר שורה (\n).
לדוגמא, אם נרצה לשמור ציונים של סטודנטים, נכתוב תחילה את שמות העמודות (כותרות), ולאחר מכן כל שורה תכלול את שם הסטודנט ואת ציוניו.
Name,Programming,Marine Biology,Stellar Cartography
Yael,50,56,70
Nadav,61,77,75
היתרון המרכזי של CSV הוא הפשטות והנגישות שלו: מדובר בקובץ טקסט קריא שניתן לפתוח בעורך טקסט רגיל, לטעון בקלות לתוך תוכנות כמו Excel, או לעבד באמצעות שפות תכנות כמו פייתון. בזכות הפורמט הישיר והסטנדרטי, CSV הוא אחד הכלים הנפוצים ביותר להעברת נתונים בין מערכות שונות.
לדוגמא, תוכן הקובץ הבא:
Name,Programming,Marine Biology,Stellar Cartography
Yael,50,56,70
Nadav,61,77,75
מייצג את הטבלה הבאה:
| Name | Programming | Marine Biology | Stellar Cartography |
| Yael | 50 | 56 | 70 |
| Nadav | 61 | 77 | 75 |
| כך יראה תוכן הקובץ בעורך טקסט פשוט:
|
כך יראה הקובץ באקסל:
|
כדי לטעון קובץ CSV מנתיב מסוים (לדוגמא, files/StudentsGrades.csv) למשתנה מטיפוס DataFrame, נשתמש בפונקציה read_csv של pandas:
inputFileName = "files/StudentsGrades.csv"
df = pd.read_csv(inputFileName)
display(df)
| Name | Programming | Marine Biology | Stellar Cartography | Math | History | Planet Survival | Art | |
|---|---|---|---|---|---|---|---|---|
| 0 | Yael | 50 | 56 | 70 | 60 | 87 | 65 | 91 |
| 1 | Nadav | 61 | 77 | 75 | 75 | 63 | 52 | 88 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 11 | Tom | 98 | 76 | 98 | 100 | 98 | 92 | 80 |
| 12 | Adi | 76 | 87 | 34 | 90 | 88 | 84 | 70 |
13 rows × 8 columns