top of page

פיצול קובץ אקסל עם פייתון ב-7 שורות קוד



בפוסט הזה נדגים כיצד ניתן לקחת קובץ אקסל המכיל טבלת נתונים, ולפצל את הנתונים בטבלה לגיליונות שונים ולארגן אותם מחדש – כל זה בשבע שורות קצרות של פייתון!

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

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

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

נניח שאנחנו גם לא יודעים מראש כמה יבשות קיימות בקובץ. ונניח גם שהמספר עלול להשתנות. עלינו לדאוג שהקוד יהיה מספיק דינמי כדי להתאים לכל מספר של יבשות מבלי לציין אותו במפורש. אין לנו בעצם אפשרות לאסוף את השמות מראש או להכין לשונית נפרדת לכל יבשת כזו.

אז בואו נתחיל. ראשית נפתח מחברת ג'ופיטר (או כל עורך קוד אחר שאתם מעדיפים להשתמש בו). במקרה הזה נצא מנקודת הנחה שהמחברת "יושבת" באותה תיקייה של קובץ האקסל עצמו. זה יאפשר לנו לגשת לקובץ רק על ידי ציון השם. במידה ואתם ניגשים לקובץ שנמצא במקום אחר או שאתם לא עובדים עם ג'ופיטר כנראה שתצטרכו לציין את הנתיב המלא לקובץ האקסל.

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

  • pandas

  • xlrd

:pandas

תאפשר לעבוד עם הנתונים בפורמט טבלאי.

ףxlrd

תאפשר לנו לקרוא את קבצי האקסל בצורה נוחה.


אם אין לכם את הספריות האלו תוכלו להתקין אותן דרך שורת הפקודה (CMD בוווינדוס, טרמינל במאק) או להריץ במחברת ג'ופיטר עצמה את הקוד הבא:




לאחר שווידאנו שיש את מה שצריך אפשר להתחיל.

נייבא את הספריות וגם נטען את נתוני הקובץ עצמו בעזרת pandas, לתוך משתנה בשם data.







טעינת הנתונים מתבצעת באמצעות הפקודה read excel, כאן כבר צריך לתת את השם של הקובץ הנקרא countries ובזכות העובדה שהמחברת נמצאת באותו נתיב מספיק לציין רק את שם הקובץ.

אפשר להציג את חמשת השורות הראשונות באמצעות הפקודה head כדי לבדוק כיצד הקובץ נראה.



בשלב הבא נרצה לייצר רשימת יבשות ייחודית שבאמצעותה נוכל לפצל את הנתונים ללשוניות השונות. ניתן לעשות את זה באמצעות פנייה לעמודה עצמה ושימוש בפקודה unique. כך נקבל רשימה ייחודית של היבשות השונות בעמודה ונציב אותה חזרה בתוך משתנה כלשהו, שבמקרה הזה נקרא לו continents.





בשלב הזה נרצה ליצור אובייקט מיוחד שיאגור את הנתונים שלנו. הסיבה שלא נוכל פשוט לייצא את הנתונים לאקסל אחרי סינון ליבשות השונות – פייתון תדרוס את הקובץ שכבר יצרנו כל פעם מחדש ותייצר קובץ חדש עם הנתונים מהיבשת הבאה. כדי לאפשר יצירה של לשוניות חדשות על אותו הקובץ, אנחנו צריכים ליצור אובייקט אקסלי ובאמצעות pandas אפשר לעשות את זה על ידי קריאה לאובייקט excel writer שהוא מעין אובייקט מיוחד שיאפשר לנו ליצור קובץ, לשמור אותו, ולהגדיר בו לשוניות שונות. צריך לתת לו שם, נקרא לקובץ הזה New_Countries כדי שיהיה קל להבדיל בין שני הקבצים, ונשמור אותו בתוך משתנה בשם file.





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

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





בנוסף אנחנו גם רוצים לארגן את הנתונים מחדש אז נוסיף את הפונקציה sort_values כדי למיין אותם. אנחנו רוצים למיין לפי שם המדינה (עמודת country) וגם לפי שנה (עמודת year) ואת כל הנתונים האלה לייצא לאקסל. נשתמש בפונקציה to_excel ונשלח את כל הנתונים לתוך האובייקט האקסלי שלנו (file). את שם היבשת נגדיר כשם הלשונית וגם נבטל את עמודת האינדקס (אין לנו שימוש בה ואין צורך לייצא אותה במקרה הזה).

ולסיום, כדי שבאמת נוכל לפתוח את הקובץ הזה, נקרא שוב ל-file בפעם האחרונה, ונבקש מ-pandas לשמור אותו ובכך לסגור הקובץ.

אם תחזרו חזרה למערכת הקבצים שלכם, אתם אמורים לראות את הקובץ החדש, מחולק ללשוניות על פי היבשות המופיעות בטבלה המקורית. וכמובן שהנתונים אפילו ממויינים לפי שמות המדינות והשנים!

וככה אנחנו מפצלים קובץ אקסל ב- 7 שורות של קוד. הקוד הסופי נראה כך:


0 תגובות

Comments


bottom of page