ספריית pandas - חלק 2 - מבני נתונים - DataFrame - חלק א

Image result for pandas logo
לאחר שעסקנו בחלק 1 במבנה הנתונים Series שהוא מבנה חד ממדי, נעסוק בפוסט הזה במבנה הנתונים DataFrame שהוא מבנה דו-ממדי והוא המבנה הנפוץ יותר בשימוש. 

המבנה DataFrame (לפעמים נקרא לו בקיצור df) יכול להכיל עמודות שכל אחת מסוג שונה. ניתן לחשוב על זה כמו על טבלת SQL.
ניתן ליצור DataFrame מ:


כשיוצרים DataFrame ניתן להעביר יחד עם הערכים גם index שהוא התוויות של השורות, ו-columns שהם התוויות של העמודות. אם למשל יוצרים DataFrame  מ-Series ומעבירים גם אינדקסים, אז רק מהאינדקסים שצוינו יווצר ה-DataFrame וכל שאר המידע לא יועבר ל-DataFrame.
אם לא מעבירים אינדקסים ו-columns הם יווצרו אוטומטית על פי המידע הנכנס.

הערה:
עבור python>=3.6 עם pandas>=0.23: 
כאשר ה-data הוא dict ולא מספקים columns, ה-columns ב-DataFrame יהיו לפי הסדר שהופיע ב-dict
עבור python<3.6 או pandas<0.23: 
ה-columns ימויינו בסדר לקסיקלי (לפי סדר האותיות והמספרים) לפי ה-keys שב-dict.
כדי לבדוק את גרסת ה-python נכתוב בשורת הפקודה:
python --version

כדי לבדוק את גרסת ה-pandas נכתוב:

pd.__version__


כדי לראות מידע על ה-DataFrame ניתן להשתמש בפונקציה:
 df.info()

יצירת DataFrame מ-dict of Series

האינדקסים יהיו איחוד של האינדקסים של ה-Series שהיו ב-dict. ה-columns יהיו שמות המפתחות של ה-dicts.
לדוגמה:


>>> d = {'one': pd.Series([1., 2., 3.], index=['a', 'b', 'c']),
         'two': pd.Series([1., 2., 3., 4.], index=['a', 'b', 'c', 'd'])}
>>> df = pd.DataFrame(d)
>>> df
   one  two
a  1.0  1.0
b  2.0  2.0
c  3.0  3.0
d  NaN  4.0

>>> df.index
Index(['a', 'b', 'c', 'd'], dtype='object')

>>> df.columns
Index(['one', 'two'], dtype='object')

ניתן ליצור df מאינדקסים מסוימים מתוך ה-Sereis או מ-columns מסוימים:


>>> pd.DataFrame(d, index=['c', 'a', 'b'])
   one  two
c  3.0  3.0
a  1.0  1.0
b  2.0  2.0

>>> pd.DataFrame(d, columns=['one'])
   one
a  1.0
b  2.0
c  3.0

אם בוחרים אינדקסים או columns שלא קיימים נקבל NaN באותם המקומות:


>>> pd.DataFrame(d, index=['c', 'a', 'b', 'f'], columns=['one', 'two','three'])
   one  two three
c  3.0  3.0   NaN
a  1.0  1.0   NaN
b  2.0  2.0   NaN
f  NaN  NaN   NaN


יצירת DataFrame מ-dict of ndarrays / lists

כשיוצרים df ממערכים או רשימות חובה שהמערכים/הרשימות יהיו באותו אורך אחרת נקבל שגיאה. בנוסף, אם מציינים במפורש את האינדקסים, חובה שמספר האינדקסים יהיה כאורך המערכים.רשימות, אחרת גם פה נקבל שגיאה.


>>> d = {'one': [1., 2., 3., 4.],
         'two': [10., 20., 30., 40.]}

>>> pd.DataFrame(d)
   one   two
0  1.0  10.0
1  2.0  20.0
2  3.0  30.0
3  4.0  40.0

>>> pd.DataFrame(d, index =['a','b','c','d'])
   one   two
a  1.0  10.0
b  2.0  20.0
c  3.0  30.0
d  4.0  40.0


ניתן גם להשתמש בפונקציה DataFrame.from_dict כדי ליצור DataFrame מ-dict of dicts או dict of arrray-like. מה שמיוחד בפונקתיה הזו הוא שאפשר לקבוע האם ה-keys של ה-dict יהיו שמות העמודות או שמות השורות, וכך כיוון ה-DataFrame משתנה. קובעים זאת ע"י הפרמטר orient. בדיפולט הוא columns ואם נקבע אותו ל-index אז ה-keys יהיו שמות השורות.
לדוגמה:

>>> pd.DataFrame.from_dict(dict([('A', [1, 2, 3]), ('B', [4, 5, 6])]))
   A  B
0  1  4
1  2  5
2  3  6

>>> pd.DataFrame.from_dict(dict([('A', [1, 2, 3]), ('B', [4, 5, 6])]), orient='index')
   0  1  2
A  1  2  3
B  4  5  6

יצירת DataFrame מ-structured or record data

דומה למקרה של יצירת df מ-dict של מערכים:


>>> data = np.zeros((2, ), dtype=[('A', 'i4'), ('B', 'f4'), ('C', 'a10')])

>>> data[:] = [(1, 2., 'Hello'), (2, 3., "pandas")]

>>> pd.DataFrame(data)
   A    B          C
0  1  2.0   b'Hello'
1  2  3.0  b'pandas'

>>> pd.DataFrame(data, index=['aa','bb'])
    A    B          C
aa  1  2.0   b'Hello'
bb  2  3.0  b'pandas'

>>> pd.DataFrame(data, columns=['C','B','A'])
           C    B  A
0   b'Hello'  2.0  1
1  b'pandas'  3.0  2


יצירת DataFrame מ-list of dicts

דומה ליצירה של df מ-list of Series:

>>> data = [{'a': 1, 'b': 2}, {'a': 10, 'b': 20, 'c': 30}]
>>> pd.DataFrame(data)
    a   b     c
0   1   2   NaN
1  10  20  30.0

>>> pd.DataFrame(data, index=['one','two'])
      a   b     c
one   1   2   NaN
two  10  20  30.0

>>> pd.DataFrame(data, columns=['a','c'])
    a     c
0   


יצירת DataFrame מ-Series

אם יוצרים df מ-Series נקבל df עם אותם ערכים ואותם אינדקסים ויהיה לו עמודה אחת בשם של ה-Series. אם אין ל-Series שם העמודות יקבלו שמות מ-0 והלאה.


>>> s = pd.Series([12, 34, 56])
>>> pd.DataFrame(s)
    0
0  12
1  34
2  56

>>> s.name = 'mySeries'

>>> pd.DataFrame(s)
   mySeries
0        12
1        34
2        56


עבודה עם עמודות

העבודה עם עמודות היא די אינטואיטיבית. להלן כמה דוגמאות פשוטות:

>>> df = pd.DataFrame({'one':[1, 2, 3]}, index = ['a', 'b', 'c'])

>>> df
   one
a    1
b    2
c    3

>>> df['two'] = df['one'] * 2
>>> df
   one  two
a    1    2
b    2    4
c    3    6

>>> df['three'] = df['one'] ** 2
>>> df
   one  two  three
a    1    2      1
b    2    4      4
c    3    6      9

>>> df['flag'] = df['one'] > 2
>>> df
   one  two  three   flag
a    1    2      1  False
b    2    4      4  False
c    3    6      9   True


מחיקת עמודה

מחיקת עמודה מתבצעת ע"י del:

>>> del df['flag']
>>> df
   one  two  three
a    1    2      1
b    2    4      4
c    3    6      9

מחיקת עמודה ולקיחה של התוכן שלה למשתנה אחר מתבצעת ע"י pop:

>>> a = df.pop('two')
>>> a
a    2
b    4
c    6
Name: two, dtype: int64

>>> df
   one  three
a    1      1
b    2      4
c    3      9


יצירת עמודות


אם יוצרים עמודה עם ערך אחד הערך נכנס לכל תאי העמודה:

>>> df['four'] = 4
>>> df['txt'] = 'Israel'
>>> df
   one  three  four     txt
a    1      1     4  Israel
b    2      4     4  Israel
c    3      9     4  Israel

ניתן להכניס מערך numpy.ndarray לתוך עמודה.
אם המערך לא יהיה באורך של העמודה תתקבל שגיאה.
לעומת זאת, אם נכניס Series שהוא לא באורך של העמודה, לא תתקבל שגיאה. אם ה-Series קצר הערכים החסרים יהיו NaN. אם הוא ארוך, רק הערכים עם אותו אינדקסים יכנסו.

>>> d = np.array([10,20,30])
>>> e = pd.Series([1,2,3,4], index = ['a','b','c','d'])
>>> c = pd.Series([10,20], index = ['a','b'])

>>> df['small'] = c
>>> df['arr'] = d
>>> df['long'] = e

>>> df
   one  three  four     txt  small  arr  long
a    1      1     4  Israel   10.0   10     1
b    2      4     4  Israel   20.0   20     2
c    3      9     4  Israel    NaN   30     3

כשיוצרים עמודות הן מתווספות לסוף ה-DataFrame. ניתן להכניס עמודות במיקומים אחרים ע"י הפונקציה insert:


>>> df.insert(1,'two', df['one']*2)
>>> df
   one  two  three  four     txt  small  arr  long
a    1    2      1     4  Israel   10.0   10     1
b    2    4      4     4  Israel   20.0   20     2
c    3    6      9     4  Israel    NaN   30     3


עד כאן להפעם.


אם אהבתם, תכתבו משהו למטה...

אין תגובות:

הוסף רשומת תגובה