0Pricing
Pandas & NumPy Academy · บทเรียน

การเข้าถึงตามป้ายกำกับและตามตำแหน่ง

ดึงสมาชิกด้วย .loc (ป้ายกำกับ) และ .iloc (ตำแหน่งจำนวนเต็ม) และทำความเข้าใจความแตกต่างระหว่างทั้งสองแบบ

การเข้าถึงตามป้ายกำกับและตามตำแหน่ง เป็นบทเรียน Pandas & NumPy Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Pandas & NumPy Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน

สองวิธีในการเข้าถึงสมาชิกของ Series

Pandas มีตัวเข้าถึงหลักสองแบบสำหรับเลือกองค์ประกอบจาก Series ได้แก่ .loc สำหรับการเข้าถึงตาม ป้ายกำกับ และ .iloc สำหรับการเข้าถึงตาม ตำแหน่งจำนวนเต็ม การทำความเข้าใจว่าควรใช้แบบใดและเมื่อใดเป็นเรื่องสำคัญอย่างยิ่ง เพราะการใช้แบบไม่ถูกต้องกับ Series ที่มีดัชนีเป็นจำนวนเต็มอาจทำให้ได้ผลลัพธ์ที่เข้าใจได้ยาก และ Pandas 2.0 ได้เลิกสนับสนุนการใช้อักขระวงเล็บเหลี่ยมโดยตรงที่มีความกำกวมหลายรูปแบบแล้ว

import pandas as pd

s = pd.Series([10, 20, 30], index=['a', 'b', 'c'])
print(s.loc['b'])    # 20  -- by label
print(s.iloc[1])     # 20  -- by position

.loc: การเข้าถึงตามป้ายกำกับ

.loc เข้าถึงองค์ประกอบโดยใช้ ป้ายกำกับดัชนี คุณสามารถส่งป้ายกำกับเดียว (ส่งคืนค่าเดี่ยว) รายการป้ายกำกับ (ส่งคืน Series) หรือช่วงของป้ายกำกับ (รวมปลายทั้งสองด้าน ซึ่งต่างจากช่วงแบบ Python) หากไม่มีป้ายกำกับนั้น Pandas จะแจ้งข้อผิดพลาด KeyError ใช้ .loc เมื่อป้ายกำกับมีความหมาย เช่น วันที่ ชื่อ หรือรหัส

import pandas as pd

s = pd.Series([10, 20, 30, 40, 50],
              index=['a', 'b', 'c', 'd', 'e'])

print(s.loc['c'])          # 30
print(s.loc[['a', 'c']])   # a:10 c:30
print(s.loc['b':'d'])      # b:20 c:30 d:40 -- inclusive

.iloc: การเข้าถึงตามตำแหน่ง

.iloc เข้าถึงองค์ประกอบโดยใช้ ตำแหน่งจำนวนเต็ม (เริ่มนับจาก 0) และไม่สนใจป้ายกำกับดัชนีโดยสิ้นเชิง การทำงานเหมือนการจัดทำดัชนีรายการแบบ Python กล่าวคือ ตำแหน่งติดลบจะนับจากท้าย และช่วงจะใช้รูปแบบที่ไม่รวมตำแหน่งสิ้นสุดตามธรรมเนียมของ Python ใช้ .iloc เมื่อต้องการองค์ประกอบลำดับที่ n โดยไม่คำนึงถึงป้ายกำกับ

import pandas as pd

s = pd.Series([10, 20, 30, 40, 50],
              index=['a', 'b', 'c', 'd', 'e'])

print(s.iloc[2])          # 30  -- third element
print(s.iloc[-1])         # 50  -- last element
print(s.iloc[1:4])        # b:20 c:30 d:40 -- exclusive stop

เมื่อ .loc และ .iloc ให้ผลต่างกัน

ความแตกต่างนี้สำคัญที่สุดสำหรับ Series ที่มีป้ายกำกับเป็นจำนวนเต็ม หาก Series มีป้ายกำกับดัชนีเป็น [5, 10, 15] ดังนั้น s.loc[5] จะส่งคืนองค์ประกอบที่มีป้ายกำกับ 5 (องค์ประกอบแรก) ขณะที่ s.iloc[5] จะแจ้งข้อผิดพลาด IndexError (มีองค์ประกอบอยู่เพียง 3 รายการ) ควรเลือกใช้โดยพิจารณาเสมอว่าคุณหมายถึง “องค์ประกอบที่มีป้ายกำกับ X” หรือ “องค์ประกอบลำดับที่ X”

import pandas as pd

s = pd.Series([100, 200, 300], index=[5, 10, 15])
print(s.loc[10])   # 200  -- element with label 10
print(s.iloc[1])   # 200  -- second element
# s.loc[1] would raise KeyError -- no label 1

การเลือกหลายป้ายกำกับด้วย .loc

ส่งรายการให้กับ .loc เพื่อเลือกหลายองค์ประกอบในลำดับใดก็ได้ และอาจมีป้ายกำกับซ้ำกัน ผลลัพธ์คือ Series ใหม่ที่มีป้ายกำกับเหมือนกับรายการที่คุณส่งเข้าไป วิธีนี้คล้ายกับการจัดทำดัชนีแบบพิเศษใน NumPy แต่จัดเรียงตามป้ายกำกับดัชนีแทนตำแหน่ง มักใช้เพื่อจัดลำดับใหม่หรือเลือกบางคอลัมน์ในกระบวนการวิเคราะห์ข้อมูล

import pandas as pd

s = pd.Series({'Jan': 100, 'Feb': 200, 'Mar': 300, 'Apr': 400})

# Select Q1 months in reverse order
print(s.loc[['Mar', 'Feb', 'Jan']])
# Mar    300
# Feb    200
# Jan    100

การเลือกช่วงป้ายกำกับด้วย .loc

ต่างจากช่วงแบบ Python ช่วงของ .loc จะ รวมปลายทั้งสองด้าน s.loc['b':'d'] จะส่งคืนองค์ประกอบที่มีป้ายกำกับ b, c และ d ซึ่งอาจทำให้ประหลาดใจหากคุณคุ้นเคยกับรูปแบบที่ไม่รวมตำแหน่งสิ้นสุดของ Python ตรวจสอบให้แน่ใจว่าป้ายกำกับที่ใช้เป็นจุดเริ่มต้นและจุดสิ้นสุดมีอยู่ในดัชนีจริง มิฉะนั้นช่วงอาจส่งคืนผลลัพธ์ที่ไม่คาดคิดโดยไม่แจ้งข้อผิดพลาด

import pandas as pd

s = pd.Series(range(5), index=['a', 'b', 'c', 'd', 'e'])
print(s.loc['b':'d'])
# b    1
# c    2
# d    3
# dtype: int64
# Note: 'd' is INCLUDED (inclusive stop)

การจัดทำดัชนีแบบบูลีนด้วย .loc

คุณสามารถส่ง Series แบบบูลีนให้กับ .loc เพื่อกรององค์ประกอบได้ โดย Series แบบบูลีนต้องมีดัชนีเดียวกับ Series เป้าหมาย วิธีนี้เทียบเท่ากับการทำหน้ากากแบบบูลีนของ NumPy และรองรับเงื่อนไขประกอบด้วย & และ | นอกจากนี้ยังเป็นวิธีมาตรฐานสำหรับกรองแถวใน DataFrames

import pandas as pd

s = pd.Series([3, 7, 2, 9, 1], index=['a', 'b', 'c', 'd', 'e'])
print(s.loc[s > 4])
# b    7
# d    9
# dtype: int64

การกำหนดค่าด้วย .loc และ .iloc

ทั้ง .loc และ .iloc สามารถอยู่ทางด้านซ้ายของการกำหนดค่าเพื่อ แก้ไข ค่าเดิมได้โดยตรง นี่คือรูปแบบที่ถูกต้อง ส่วนการจัดทำดัชนีต่อเนื่อง เช่น s['a'] = 99 อาจทำให้เกิด SettingWithCopyWarning ใน DataFrames สำหรับ Series การเข้าถึงป้ายกำกับโดยตรงมักปลอดภัย แต่ควรใช้ .loc เพราะระบุเจตนาได้ชัดเจนกว่า

import pandas as pd

s = pd.Series([10, 20, 30], index=['a', 'b', 'c'])
s.loc['b'] = 99
print(s)
# a    10
# b    99
# c    30

การเข้าถึง Series ด้วยวงเล็บเหลี่ยม

รูปแบบวงเล็บเหลี่ยมโดยตรง s['label'] ใช้เข้าถึงตามป้ายกำกับ และเทียบเท่ากับ s.loc['label'] เมื่อดัชนีเป็นข้อความ สำหรับดัชนีจำนวนเต็ม พฤติกรรมมีความกำกวมและถูกเปลี่ยนใน Pandas 2.0 โดยขณะนี้จะหมายถึงการเข้าถึงตามป้ายกำกับเสมอ เพื่อให้โค้ดชัดเจนและรองรับอนาคต ควรใช้ .loc หรือ .iloc อย่างชัดเจน แทนการพึ่งพาการแยกความหมายจากวงเล็บเหลี่ยม

import pandas as pd

s = pd.Series([10, 20, 30], index=['x', 'y', 'z'])
print(s['y'])      # 20  -- label access via brackets
print(s.loc['y']) # 20  -- explicit and preferred

การเข้าถึงองค์ประกอบจาก DatetimeIndex

เมื่อ Series มี DatetimeIndex แล้ว .loc จะรับข้อความวันที่เพียงบางส่วนเพื่อเลือกช่วงได้อย่างสะดวก s.loc['2023'] จะส่งคืนองค์ประกอบทั้งหมดของปี 2023 และ s.loc['2023-01':'2023-06'] จะส่งคืนองค์ประกอบในช่วงหกเดือนแรกของปี 2023 นี่เป็นหนึ่งในความสามารถของ Pandas ที่ใช้งานกับข้อมูลอนุกรมเวลาได้สะดวกที่สุด

import pandas as pd

dates = pd.date_range('2023-01-01', periods=5, freq='ME')
values = pd.Series([10, 20, 30, 40, 50], index=dates)
print(values.loc['2023-03':'2023-05'])
# 2023-03-31    30
# 2023-04-30    40
# 2023-05-31    50

at และ iat สำหรับเข้าถึงองค์ประกอบเดียวอย่างรวดเร็ว

.at[label] และ .iat[position] เป็นตัวเข้าถึงค่าเดี่ยวที่ได้รับการปรับให้มีประสิทธิภาพสูงกว่า .loc และ .iloc เมื่อเข้าถึงองค์ประกอบเดียวซ้ำ ๆ ในลูปที่ทำงานถี่ เพราะข้ามค่าใช้จ่ายในการสร้างออบเจกต์ Series ผลลัพธ์ ทั้งสองแบบไม่สามารถใช้เลือกหลายองค์ประกอบได้ ใช้เมื่อจำเป็นต้องเพิ่มประสิทธิภาพสูงสุดสำหรับการค้นหาองค์ประกอบเดียวซ้ำ ๆ

import pandas as pd

s = pd.Series([10, 20, 30], index=['a', 'b', 'c'])
print(s.at['b'])    # 20  -- label scalar access
print(s.iat[2])     # 30  -- position scalar access

ตรวจสอบความเข้าใจ

ทดสอบความเข้าใจเกี่ยวกับ .loc และ .iloc จากบทเรียนนี้

สรุปบทเรียน

ในบทเรียนนี้ คุณได้เรียนรู้ว่า .loc เข้าถึงองค์ประกอบตามป้ายกำกับดัชนี โดยช่วงจะรวมตำแหน่งสิ้นสุด .iloc เข้าถึงองค์ประกอบตามตำแหน่งจำนวนเต็ม โดยช่วงไม่รวมตำแหน่งสิ้นสุดเช่นเดียวกับรายการแบบ Python และ .at กับ .iat เป็นตัวเข้าถึงค่าเดี่ยวที่เร็วกว่าเมื่อต้องค้นหาองค์ประกอบเดียวในลูป บทถัดไปเราจะสำรวจการดำเนินการแบบเวกเตอร์บน Series และวิธีที่ Pandas จัดแนวดัชนีให้โดยอัตโนมัติ

คำถามที่พบบ่อย

บทเรียน “การเข้าถึงตามป้ายกำกับและตามตำแหน่ง” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การเข้าถึงตามป้ายกำกับและตามตำแหน่ง” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Pandas & NumPy Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การเข้าถึงตามป้ายกำกับและตามตำแหน่ง”

ดึงสมาชิกด้วย .loc (ป้ายกำกับ) และ .iloc (ตำแหน่งจำนวนเต็ม) และทำความเข้าใจความแตกต่างระหว่างทั้งสองแบบ คุณปฏิบัติ Pandas & NumPy Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Pandas & NumPy Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Pandas & NumPy Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “การเข้าถึงตามป้ายกำกับและตามตำแหน่ง” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Pandas & NumPy Academy นี้ได้ไหม

ได้ บทเรียน Pandas & NumPy Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การสร้าง Series
  2. การเข้าถึงตามป้ายกำกับและตามตำแหน่ง
  3. การดำเนินการแบบเวกเตอร์บน Series
  4. เมธอด Series ที่มีประโยชน์
← กลับไปที่ Pandas & NumPy Academy