طريقتان لتحديد البيانات: بالوسم وبالموضع
يمكن عنونة إطار البيانات بطريقتين، والخلط بينهما أشيع أخطاء pandas. يختار .loc بـالوسم: وسوم الصفوف من الفهرس وأسماء الأعمدة. ويختار .iloc بـالموضع الصحيح المعدود من 0 كما في قائمة أو مصفوفة NumPy. وكلاهما يأخذ [الصفوف, الأعمدة]: فـdf.loc["AAPL", "price"] قيمة واحدة وdf.iloc[0, 0] قيمة الصف الأول والعمود الأول. احذف الجزء الثاني لأخذ صفوف كاملة: df.loc["AAPL"] هو صف AAPL كسلسلة.
import pandas as pd
df = pd.DataFrame(
{"price": [184.25, 410.2, 171.0, 251.0],
"volume": [200, 50, 300, 120],
"sector": ["tech", "tech", "tech", "auto"]},
index=["AAPL", "MSFT", "GOOG", "TSLA"],
)
print(df.loc["AAPL", "price"], df.iloc[0, 0]) # 184.25 184.25 same cell, two addresses
print(df.loc["TSLA"].to_dict()) # {'price': 251.0, 'volume': 120, 'sector': 'auto'}
print(df.iloc[-1].to_dict()) # the same row: position -1 is the last
print(df.loc[["TSLA", "AAPL"], "price"]) # a list of labels picks in that order
# TSLA 251.00
# AAPL 184.25
# Name: price, dtype: float64
try:
df.loc["XXX", "price"] # a label that does not exist
except KeyError as error:
print("KeyError", error) # KeyError 'XXX'الشرائح: شرائح الوسوم تشمل النهاية
تتصرف الشرائح بشكل مختلف في النظامين. فشريحة الموضع df.iloc[1:3] تتبع قاعدة بايثون وتستثني النهاية: الموضعين 1 و2. أما شريحة الوسوم df.loc["MSFT":"TSLA"] فـتشمل وسمي الطرفين معًا، إذ لا «تالي» طبيعي للوسم. وتتبع شرائح الوسوم الترتيب الحالي للفهرس وليس شرطًا أن يكون مرتّبًا. وللأعمدة مرّر قائمة (["price", "volume"]) لأخذها بالترتيب الذي تعطيه. ونسيان أي نظام أنت فيه يعطي نتائج مزاحة بواحد دون أي خطأ.
import pandas as pd
df = pd.DataFrame(
{"price": [184.25, 410.2, 171.0, 251.0], "volume": [200, 50, 300, 120]},
index=["AAPL", "MSFT", "GOOG", "TSLA"],
)
print(df.iloc[1:3]) # positions 1 and 2: the end is excluded
# price volume
# MSFT 410.2 50
# GOOG 171.0 300
print(df.loc["MSFT":"TSLA", ["volume", "price"]]) # labels MSFT..TSLA: the end is included
# volume price
# MSFT 50 410.2
# GOOG 300 171.0
# TSLA 120 251.0
print(df.iloc[:, 0].tolist()) # the first column, by position
# [184.25, 410.2, 171.0, 251.0]الشروط والإسناد مع loc
يقبل .loc أيضًا قناعًا منطقيًا للصفوف: df.loc[df["volume"] > 100, "price"] هو عمود الأسعار للصفوف التي تجتاز الاختبار، في خطوة واحدة. و.loc هو طريقة الإسناد إلى جزء مختار: df.loc["MSFT", "price"] = 1.0 تغيّر خلية واحدة وdf.loc[df["volume"] < 100, "volume"] = 0 تغيّر كل الصفوف المطابقة. وتجنّب الصيغ المتسلسلة مثل df[df["volume"] < 100]["volume"] = 0: فهي تعمل على نسخة مؤقتة. وفي pandas 3 لا يغيّر إطار مشتق الأصل أبدًا، فلتعديل جدول داخل دالة اعمل أولًا df.copy() ثم أسند بـ.loc وأرجع النسخة.
import pandas as pd
df = pd.DataFrame(
{"price": [184.25, 410.2, 171.0, 251.0], "volume": [200, 50, 300, 120]},
index=["AAPL", "MSFT", "GOOG", "TSLA"],
)
print(df.loc[df["volume"] > 100, "price"]) # a Boolean mask for rows, a label for the column
# AAPL 184.25
# GOOG 171.00
# TSLA 251.00
# Name: price, dtype: float64
def with_price(frame, symbol, price):
out = frame.copy() # never edit the caller's table
out.loc[symbol, "price"] = price
return out
changed = with_price(df, "MSFT", 1.0)
print(changed.loc["MSFT", "price"], df.loc["MSFT", "price"]) # 1.0 410.2
fixed = df.copy()
fixed.loc[fixed["volume"] < 100, "volume"] = 0 # assign to all matching rows at once
print(fixed["volume"].tolist()) # [200, 0, 300, 120]import pandas as pd
# Integer labels are labels, not positions: a classic trap
d = pd.DataFrame({"x": [1.0, 2.0, 3.0]}, index=[10, 20, 30])
print(d.loc[20, "x"], d.iloc[0, 0]) # 2.0 1.0 label 20 is the second row
print(d.loc[10:20]["x"].tolist()) # [1.0, 2.0] labels 10 through 20, end included
print(d.iloc[0:2]["x"].tolist()) # [1.0, 2.0] positions 0 and 1, end excluded
try:
d.loc[0, "x"] # there is no label 0, even though position 0 exists
except KeyError as error:
print("KeyError", error) # KeyError 0.loc حين تعرف الأسماء (رمز أو تاريخ أو عمود) و.iloc فقط حين يكون الموضع هو المقصود («الصف الأخير» و«الثلاثة الأولى»). ويستمر الكود المبني على الوسوم بالعمل حين يُعاد ترتيب الصفوف؛ أما المبني على المواضع فيبدأ بصمت باختيار صفوف أخرى. وdf[...] المجردة اختصار متعدد المعاني (عمود أو قائمة أعمدة أو قناع صفوف)، فاكتب .loc أو .iloc صراحةً في الدوال المهمة. ويطلب المختبر أحدهما أو الآخر عمدًا.df.loc[وسم_الصف, وسم_العمود]بالوسم؛ وdf.iloc[موضع_الصف, موضع_العمود]بالموضع من 0.- شرائح
ilocتستثني النهاية؛ وشرائح وسومlocتشملها؛ والوسم الغائب يرفعKeyError. df.loc[mask, "col"]ترشّح وتختار؛ وأسند عبر.locعلى.copy()وأرجعها.
التالي: groupby والتجميع، تقسيم جدول إلى مجموعات وتلخيص كل منها.
المختبر: ما الذي يُقيَّم
- ابحث عن سعر بالرمز باستخدام
price_of25 نقطة - خذ الصفوف بين رمزين باستخدام
label_range25 نقطة - خذ صفوفًا بالموضع باستخدام
position_range25 نقطة - صحّح سعرًا في نسخة باستخدام
set_price25 نقطة