גישה ועבודה עם ערכים ספציפיים ב- Pandas

בחירת ערכים ספציפיים מתוך DataFrame או Series היא אחת הפעולות הבסיסיות והשימושיות ב- Pandas. בחלק זה נלמד כיצד לגשת לערכים ספציפיים ולשלוף אותם במהירות וביעילות.

שימוש בנקודה ושם של שדה

אחד הדברים הנוחים ב- Pandas הוא האפשרות לגשת לערכים ממש כמו שניגשים לערכים של אובייקט בפייתון “נקי”. בואו נראה כיצד עושים זאת.

נניח שיש לנו DataFrame בשם wine_reviews אשר מחזיק את ה- DataSet של חוות הדעת על טעימות היין מהחלק הקודם.

print(wine_reviews)

בפייתון, אפשר לגשת לשדה של אובייקט על ידי נקודה ואז שם השדה. אם למשל יש לנו אובייקט בשם book ואנו רוצים לגשת לשדה author שלו, נכתוב

book.author

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

print(wine_reviews.country)

שימוש בסוגריים מרובעים ושם השדה

דרך נוספת לשלוף עמודה מתוך DataSet, היא באמצעות סוגריים מרובעים ושם השדה ביניהם. גם כאן, זה זהה לגישה לשדה של אובייקט בפייתון בסיסי. בואו נשלוף שוב את העמודה country, אבל הפעם נשתמש בסוגריים מרובעים:

print(wine_reviews['country'])

ואנו מקבלים את אותה תוצאה שקיבלנו קודם.

שימו לב: כאשר השתמשנו בסוגריים מרובעים, היינו חייבים לשים את שם העמודה כמחרוזת בתוך גרשיים, ואילו כאשר השתמשנו בנקודה כתבנו את שם העמודה ללא גרשיים.

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

גישה לערך בתוך עמודה

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

print(wine_reviews.country[15])

האופרטורים loc ו- iloc

סוגריים מרובעים (ונקודות) ב- Pandas שמשמשים לגישה לעמודות, הם לא יותר מאשר קיצורים שימושיים.
מעבר אליהם, יש ב- Pandas שני אופרטורים ייעודיים לגישה לערכים של DataFrame. האופרטורים הללו נקראים loc ו- iloc, ובהרבה מקרים נרצה להשתמש בהם ולא בתחליף של הסוגריים המרובעים (או הנקודות).

האופרטור iloc

כדי לשלוף את השורה הראשונה ב- DataFrame, ניגש לאינדקס 0 של האופרטור iloc.

print(wine_reviews.iloc[0])

שימו לב שכעת קיבלנו את כל 13 העמודות של השורה הראשונה.

אם נרצה להשתמש ב- iloc כדי לשלוף את העמודה הראשונה בשלמותה, נשתמש בנקודותיים כדי לבחור את כל השורות:

print(wine_reviews.iloc[:,0])

אפשר גם לבחור חלק מהשורות של עמודה. אם למשל נרצה לבחור את השורות 0, 1, 2 מהעמודה הראשונה על ידי iloc:

print(wine_reviews.iloc[:3,0])

על ידי מספרים שליליים, אפשר לבחור שורות מהסוף. אם נרצה לבחור את השורה האחרונה, נשתמש באינדקס 1-:

print(wine_reviews.iloc[:-2,-1])

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

print(wine_reviews.iloc[[5, 15, 25],2])

האופרטור loc

בשונה מ- iloc אשר מאפשר בחירה על סמך אינדקסים, loc מאפשר בחירה על סמך ערכים.
בכל הדוגמאות שראינו עד כה, שהיו על iloc, בחרנו את העמודה הרצויה (או העמודות הרצויות) לפי האינדקס שלה (או שלהן). ב- loc, לעומת זאת, אנו מעבירים את שם העמודה ולא את האינדקס שלה.
אם למשל נרצה את המדינה שבשורה הראשונה:

print(wine_reviews.loc[0,'country'])

אם נרצה לבחור רק את העמודות של שמות הטועמים, שמות המשתמש בטוויטר וניקוד, נוכל לעשות זאת כך:

print(wine_reviews.loc[:,['taster_name', 'taster_twitter_handle', 'points'])

כולל או לא כולל את האיבר האחרון?

שימו לב שיש הבדל דק, אבל משמעותי בין iloc לבין loc. כאשר משתמשים ב- iloc, האופרטור לא כולל את האיבר האחרון בטווח שאנו מגדירים. ב- loc, לעומת זאת, האופרטור כולל את האיבר האחרון. דוגמא:

print("\nChoosing 0:2 with iloc:");
print(wine_reviews.iloc[0:2, 8])
print("\nChoosing 0:2 with loc:");
print(wine_reviews.loc[0:2, 'taster_name'])

שימו לב שאף שבשתי הקריאות ביקשנו את הערכים בטווח 0:2, כאשר השתמשנו ב- iloc קיבלנו 2 ערכים בלבד (באינדקסים 0, 1) ואילו כאשר השתמשנו ב- loc, קיבלנו 3 ערכים (באינדקסים 0, 1, 2).

בניית תנאים בוליאניים על הנתונים

כאשר יש לנו DataFrame, אפשר להריץ שאילתות על הנתונים. בואו נניח, למשל, שאנו רוצים לבדוק עבור כל שורה אם ה- country שלה הוא US.
לצורך כך, פשוט נריץ את השורה:

print(wine_reviews.country == 'US')

אנו רואים שקיבלנו את הערך True עבור השורות בהן התנאי התקיים, ו- False היכן שלא.

בחירת שורות לפי תנאים בוליאניים

אפשר גם להשתמש בתוצאה של התנאי כדי לבחור רק את השורות שמקיימות אותו. בואו נבחר למשל את השורות עבורן ה- country שווה ל- US:

print(wine_reviews.loc[country == 'US'])

שימו לב שקיבלנו 54504 שורות מתאימות מתוך 129971 שורות שקיימות ב- DataSet.

אפשר גם לבחור שורות שמתאימות לתנאי מורכב. אפשר למשל להשתמש באופרטור & כדי לבדוק נכונות של שני תנאים. רק אם שני התנאים מתקיימים, השורה תיבחר. בואו נבחר רק את השורות שעבורן ה- country הוא Italy וגם ערך ה- points הוא מעל 90:

print(wine_reviews.loc[(wine_reviews.country == 'Italy') & (wine_reviews.points >= 90)])

שימו לב שכעת נבחרו רק 6648 השורות שענו על התנאים.

חשוב: כאשר בונים תנאים מורכבים ב- Pandas, חייבים לשים כל אחד מהתנאים הבסיסיים בתוך סוגריים. אם נכתוב שני תנאים בסיסיים וביניהם אופרטור של & או | אבל לא נשים את התנאים הבסיסיים בסוגריים, נקבל שגיאה.

באופן דומה, אפשר להפעיל גם לוגיקה של “או”. בואו נבחר, למשל, את כל השורות עבורן ה- country שווה ל- Italy או ערך ה- points גדול מ- 90.

print(print(wine_reviews.loc[(wine_reviews.country == 'Italy') | (wine_reviews.points >= 90)]))

הפונקציה isin ב- Pandas

לפעמים נרצה לבחור את השורות אשר הערך של שדה שלהן שייך לקבוצה של ערכים. בואו נניח למשל שאנו רוצים לבחור את כל השורות שה- country שלהן הוא Italy, US או France. כמובן שדרך אחת לעשות זאת היא באמצעות שלושה תנאים וביניהם or (|):

print(wine_reviews.loc[
    (wine_reviews.country == 'Italy')
    | (wine_reviews.country == 'US')
    | (wine_reviews.country == 'France')])

אך ישנה דרך נוספת ששימושית במיוחד כאשר אנו רוצים לבחור מתוך מספר גדול של אפשרויות. הדרך הנוספת הזו היא להשתמש בפונקציה isin. הפונקציה isin מקבלת רשימה כפרמטר ובודקת האם ערך השדה שווה לאחד הערכים שברשימה.

print(wine_reviews.loc[
    wine_reviews.country.isin(['Italy', 'US', 'France'])])