יצירת טבלה וטעינת נתונים#
נתחיל מטבלה קטנה של תכונות פיזיקליות של תרכובות: שם, נוסחה, משפחה כימית, מסה מולרית, נקודת התכה ונקודת רתיחה. אלה נתונים טבלאיים טבעיים: לכל שורה יש תרכובת אחת, וכל עמודה מתארת תכונה אחת.
Note
אפשר להוריד את קובץ הנתונים לעבודה עצמאית: compound_phase_points.csv.
יצירת DataFrame ממילון של רשימות#
כאשר הנתונים קטנים מאוד, אפשר ליצור טבלה ישירות בקוד. במילון של רשימות, כל מפתח במילון הופך לשם עמודה, וכל רשימה הופכת לערכים באותה עמודה.
import pandas as pd
small_data = {
"compound": ["water", "ethanol", "hexane"],
"formula": ["H2O", "C2H6O", "C6H14"],
"boiling_point_C": [100.0, 78.4, 68.7],
}
small_df = pd.DataFrame(small_data)
display(small_df)
| compound | formula | boiling_point_C | |
|---|---|---|---|
| 0 | water | H2O | 100.0 |
| 1 | ethanol | C2H6O | 78.4 |
| 2 | hexane | C6H14 | 68.7 |
שימו לב: המספרים שמופיעים בצד שמאל הם שמות השורות. אם לא קבענו שמות בעצמנו, Pandas נותנת לשורות שמות מספריים: 0, 1, 2, וכן הלאה. אלה אינם חלק מהנתונים הכימיים עצמם.
טעינת טבלה מקובץ CSV#
בפועל, לרוב לא נקליד טבלאות ידנית. נקבל קובץ נתונים ונקרא אותו לפייתון. קובץ CSV הוא קובץ טקסט שבו כל שורה היא רשומה, והערכים מופרדים בפסיקים.
data_path = "files/compound_phase_points.csv"
df = pd.read_csv(data_path)
display(df)
| compound | formula | family | molar_mass_g_mol | melting_point_C | boiling_point_C | polarity | |
|---|---|---|---|---|---|---|---|
| 0 | water | H2O | inorganic | 18.02 | 0.0 | 100.0 | polar |
| 1 | methanol | CH4O | alcohol | 32.04 | -97.6 | 64.7 | polar |
| 2 | ethanol | C2H6O | alcohol | 46.07 | -114.1 | 78.4 | polar |
| 3 | 1-propanol | C3H8O | alcohol | 60.10 | -126.0 | 97.2 | polar |
| 4 | acetone | C3H6O | ketone | 58.08 | -94.7 | 56.1 | polar |
| 5 | diethyl ether | C4H10O | ether | 74.12 | -116.3 | 34.6 | weakly polar |
| 6 | hexane | C6H14 | alkane | 86.18 | -95.0 | 68.7 | nonpolar |
| 7 | heptane | C7H16 | alkane | 100.20 | -90.6 | 98.4 | nonpolar |
| 8 | benzene | C6H6 | aromatic | 78.11 | 5.5 | 80.1 | nonpolar |
| 9 | toluene | C7H8 | aromatic | 92.14 | -95.0 | 110.6 | nonpolar |
| 10 | acetic acid | C2H4O2 | carboxylic acid | 60.05 | 16.6 | 118.1 | polar |
| 11 | chloroform | CHCl3 | halogenated | 119.38 | -63.5 | 61.2 | weakly polar |
| 12 | ethane | C2H6 | alkane | 30.07 | -182.8 | -88.6 | nonpolar |
| 13 | butane | C4H10 | alkane | 58.12 | -138.3 | -0.5 | nonpolar |
| 14 | naphthalene | C10H8 | aromatic | 128.17 | 80.2 | 218.0 | nonpolar |
| 15 | benzoic acid | C7H6O2 | carboxylic acid | 122.12 | 122.4 | 249.2 | polar |
המשתנה df הוא DataFrame. כל שורה מייצגת תרכובת אחת, וכל עמודה מייצגת תכונה של התרכובת.
מבט ראשון על הטבלה#
לפני שמבצעים חישוב, כדאי לבדוק מה יש בטבלה. head מציגה את השורות הראשונות:
display(df.head())
| compound | formula | family | molar_mass_g_mol | melting_point_C | boiling_point_C | polarity | |
|---|---|---|---|---|---|---|---|
| 0 | water | H2O | inorganic | 18.02 | 0.0 | 100.0 | polar |
| 1 | methanol | CH4O | alcohol | 32.04 | -97.6 | 64.7 | polar |
| 2 | ethanol | C2H6O | alcohol | 46.07 | -114.1 | 78.4 | polar |
| 3 | 1-propanol | C3H8O | alcohol | 60.10 | -126.0 | 97.2 | polar |
| 4 | acetone | C3H6O | ketone | 58.08 | -94.7 | 56.1 | polar |
המאפיין shape אומר כמה שורות וכמה עמודות יש בטבלה. התוצאה היא זוג: (number_of_rows, number_of_columns).
print(df.shape)
(16, 7)
המאפיין dtypes מציג את טיפוס הנתונים בכל עמודה. לדוגמה, עמודות מספריות יהיו לרוב float64, ועמודות טקסט כמו שם התרכובת יהיו object.
print(df.dtypes)
compound str
formula str
family str
molar_mass_g_mol float64
melting_point_C float64
boiling_point_C float64
polarity str
dtype: object
שמות עמודות ושמות שורות#
שמות העמודות נשמרים ב־df.columns, ושמות השורות נשמרים ב־df.index:
print(df.columns)
print(df.index)
Index(['compound', 'formula', 'family', 'molar_mass_g_mol', 'melting_point_C',
'boiling_point_C', 'polarity'],
dtype='str')
RangeIndex(start=0, stop=16, step=1)
במחברות הבאות נשתמש בשמות האלה כדי לבחור חלקים מתוך הטבלה. הרעיון המרכזי הוא פשוט: במקום לזכור שעמודה מסוימת נמצאת במקום מספר 5, אפשר לבקש את העמודה לפי השם שלה, למשל "boiling_point_C".