שימו לב: על מנת להריץ את התאים ב-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    

מייצג את הטבלה הבאה:

NameProgrammingMarine BiologyStellar Cartography
Yael505670
Nadav617775






כך יראה תוכן הקובץ בעורך טקסט פשוט: כך יראה הקובץ באקסל:

כדי לטעון קובץ 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