มีสองวิธีหลักที่แพนด้าทำการเลือกจาก DataFrame
- ตามป้ายกำกับ
- ตามสถานที่ตั้งจำนวนเต็ม
เอกสารที่ใช้คำว่าตำแหน่งหมายถึงสถานที่ตั้งของจำนวนเต็ม ฉันไม่ชอบคำศัพท์นี้เพราะฉันรู้สึกสับสน ตำแหน่งจำนวนเต็มนั้นมีความหมายมากกว่าและเป็นสิ่งที่ถูก.ilocต้อง คำสำคัญที่นี่คือINTEGER - คุณต้องใช้จำนวนเต็มเมื่อเลือกตามตำแหน่งจำนวนเต็ม
ก่อนที่จะแสดงข้อมูลสรุปให้ทุกคนตรวจสอบให้แน่ใจว่า ...
.ix เลิกใช้แล้วและคลุมเครือและไม่ควรใช้
มีดรรชนีหลักสามตัวสำหรับนุ่น ขณะนี้มีผู้ประกอบการจัดทำดัชนีของตัวเอง (วงเล็บ[]) และ.loc .ilocมาสรุปกัน:
[]- หลักเลือกชุดย่อยของคอลัมน์ แต่สามารถเลือกแถวได้เช่นกัน ไม่สามารถเลือกแถวและคอลัมน์พร้อมกัน
.loc - เลือกชุดย่อยของแถวและคอลัมน์ตามป้ายกำกับเท่านั้น
.iloc - เลือกชุดย่อยของแถวและคอลัมน์ตามตำแหน่งจำนวนเต็มเท่านั้น
ฉันแทบไม่เคยใช้.atหรือ.iatไม่เพิ่มฟังก์ชั่นเพิ่มเติมและเพิ่มประสิทธิภาพเพียงเล็กน้อย ฉันจะกีดกันการใช้งานของพวกเขาหากคุณไม่มีแอปพลิเคชันที่มีความอ่อนไหวต่อเวลา ไม่ว่าเราจะมีบทสรุป:
.at เลือกค่าสเกลาร์เดียวใน DataFrame ตามป้ายกำกับเท่านั้น
.iat เลือกค่าสเกลาร์เดียวใน DataFrame ตามตำแหน่งจำนวนเต็มเท่านั้น
นอกเหนือจากการเลือกตามเลเบลและตำแหน่งจำนวนเต็มการเลือกแบบบูลหรือที่เรียกว่าการจัดทำดัชนีบูลีนนั้นมีอยู่
ตัวอย่างการอธิบาย.loc, การ.ilocเลือกบูลีนและ.atและ.iatแสดงอยู่ด้านล่าง
ครั้งแรกที่เราจะมุ่งเน้นไปที่ความแตกต่างระหว่างและ.loc .ilocก่อนที่เราจะพูดถึงความแตกต่างสิ่งสำคัญคือต้องเข้าใจว่า DataFrames มีป้ายกำกับที่ช่วยระบุแต่ละคอลัมน์และแต่ละแถว ลองมาดูตัวอย่าง DataFrame:
df = pd.DataFrame({'age':[30, 2, 12, 4, 32, 33, 69],
'color':['blue', 'green', 'red', 'white', 'gray', 'black', 'red'],
'food':['Steak', 'Lamb', 'Mango', 'Apple', 'Cheese', 'Melon', 'Beans'],
'height':[165, 70, 120, 80, 180, 172, 150],
'score':[4.6, 8.3, 9.0, 3.3, 1.8, 9.5, 2.2],
'state':['NY', 'TX', 'FL', 'AL', 'AK', 'TX', 'TX']
},
index=['Jane', 'Nick', 'Aaron', 'Penelope', 'Dean', 'Christina', 'Cornelia'])

คำทั้งหมดที่เป็นตัวหนาคือป้ายกำกับ ป้าย, age, color, food, height, scoreและstateใช้สำหรับคอลัมน์ ป้ายอื่น ๆJane, Nick, Aaron, Penelope, Dean, Christina, Corneliaใช้เป็นป้ายชื่อสำหรับแถว เรียกรวมกันว่าป้ายแถวเหล่านี้เป็นที่รู้จักกันเป็นดัชนี
วิธีหลักในการเลือกแถวใดแถวหนึ่งใน DataFrame คือด้วย.locและตัว.ilocสร้างดัชนี ตัวทำดัชนีแต่ละตัวเหล่านี้ยังสามารถใช้ในการเลือกคอลัมน์พร้อมกันได้ด้วย แต่ตอนนี้มันง่ายกว่าที่จะมุ่งเน้นไปที่แถวในตอนนี้ นอกจากนี้ตัวจัดทำดัชนีแต่ละตัวใช้ชุดของวงเล็บที่ตามชื่อทันทีเพื่อทำการเลือก
.loc เลือกข้อมูลตามป้ายกำกับเท่านั้น
ก่อนอื่นเราจะพูดถึง.locตัวสร้างดัชนีซึ่งเลือกข้อมูลตามป้ายกำกับดัชนีหรือคอลัมน์เท่านั้น ใน DataFrame ตัวอย่างของเราเราได้ให้ชื่อที่มีความหมายเป็นค่าสำหรับดัชนี DataFrames จำนวนมากจะไม่มีชื่อที่มีความหมายและจะเป็นค่าเริ่มต้นเป็นจำนวนเต็มตั้งแต่ 0 ถึง n-1 โดยที่ n คือความยาว (จำนวนแถว) ของ DataFrame
มีอินพุตที่แตกต่างกันมากมายที่คุณสามารถใช้ได้.locสามแบบ
- สตริง
- รายการของสตริง
- สัญกรณ์ Slice โดยใช้สตริงเป็นค่าเริ่มต้นและหยุด
การเลือกแถวเดียวกับ. loc ด้วยสตริง
ในการเลือกข้อมูลแถวเดียวให้วางเลเบลดัชนีไว้ในวงเล็บ.locข้างล่างนี้
df.loc['Penelope']
ส่งคืนแถวของข้อมูลในรูปแบบ
age 4
color white
food Apple
height 80
score 3.3
state AL
Name: Penelope, dtype: object
การเลือกหลายแถวด้วย. loc ด้วยรายการสตริง
df.loc[['Cornelia', 'Jane', 'Dean']]
ส่งคืน DataFrame พร้อมแถวตามลำดับที่ระบุในรายการ:

การเลือกหลายแถวด้วย. loc ด้วยสัญกรณ์ชิ้น
สัญกรณ์ Slice ถูกกำหนดโดยค่าเริ่มต้นหยุดและขั้นตอน เมื่อแบ่งตามป้ายกำกับแพนด้าจะรวมค่าหยุดในการส่งคืน ชิ้นต่อไปนี้จากแอรอนถึงดีนรวม ขนาดขั้นตอนไม่ได้กำหนดไว้อย่างชัดเจน แต่มีค่าเริ่มต้นเป็น 1
df.loc['Aaron':'Dean']

สามารถแบ่งส่วนที่ซับซ้อนได้ในลักษณะเดียวกับรายการ Python
.iloc เลือกข้อมูลตามตำแหน่งจำนวนเต็มเท่านั้น
.ilocตอนนี้ขอให้หันไป ทุกแถวและคอลัมน์ของข้อมูลใน DataFrame มีตำแหน่งจำนวนเต็มที่กำหนด นี่คือนอกเหนือจากป้ายกำกับที่แสดงด้วยสายตาในผลลัพธ์ ตำแหน่งจำนวนเต็มเป็นเพียงจำนวนแถว / คอลัมน์จากด้านบน / ซ้ายเริ่มต้นที่ 0
มีอินพุตที่แตกต่างกันมากมายที่คุณสามารถใช้ได้.ilocสามแบบ
- จำนวนเต็ม
- รายการจำนวนเต็ม
- สัญกรณ์ Slice โดยใช้จำนวนเต็มเป็นค่าเริ่มต้นและหยุด
การเลือกแถวเดียวด้วย .iloc ด้วยจำนวนเต็ม
df.iloc[4]
ส่งคืนแถวที่ 5 (ตำแหน่งจำนวนเต็ม 4) เป็นซีรีย์
age 32
color gray
food Cheese
height 180
score 1.8
state AK
Name: Dean, dtype: object
การเลือกหลายแถวด้วย. iloc พร้อมรายการจำนวนเต็ม
df.iloc[[2, -2]]
ส่งคืน DataFrame ของแถวที่สามและแถวที่สองเป็นแถวสุดท้าย:

การเลือกหลายแถวด้วย .iloc พร้อมเครื่องหมายชิ้น
df.iloc[:5:3]

การเลือกแถวและคอลัมน์พร้อมกันด้วย. loc และ .iloc
หนึ่งความสามารถที่ยอดเยี่ยมของทั้งสอง.loc/.ilocคือความสามารถในการเลือกทั้งแถวและคอลัมน์พร้อมกัน ในตัวอย่างข้างต้นคอลัมน์ทั้งหมดถูกส่งคืนจากการเลือกแต่ละรายการ เราสามารถเลือกคอลัมน์ที่มีอินพุตเหมือนกันกับแถว เราก็ต้องแยกการเลือกแถวและคอลัมน์ที่มีเครื่องหมายจุลภาค
ตัวอย่างเช่นเราสามารถเลือกแถว Jane และ Dean ด้วยความสูงคอลัมน์คะแนนและสถานะดังนี้:
df.loc[['Jane', 'Dean'], 'height':]

สิ่งนี้ใช้รายการของป้ายกำกับสำหรับแถวและสัญกรณ์ชิ้นสำหรับคอลัมน์
เราสามารถดำเนินการที่คล้ายกัน.ilocโดยใช้จำนวนเต็มเท่านั้น
df.iloc[[1,4], 2]
Nick Lamb
Dean Cheese
Name: food, dtype: object
การเลือกพร้อมกันพร้อมป้ายกำกับและตำแหน่งจำนวนเต็ม
.ixใช้ในการเลือกพร้อมกันกับป้ายกำกับและตำแหน่งจำนวนเต็มซึ่งมีประโยชน์ แต่สับสนและคลุมเครือในบางครั้งและขอบคุณที่เลิกใช้แล้ว ในกรณีที่คุณต้องทำการเลือกด้วยการผสมผสานของป้ายชื่อและตำแหน่งจำนวนเต็มคุณจะต้องสร้างทั้งป้ายชื่อตัวเลือกหรือตำแหน่งจำนวนเต็ม
ตัวอย่างเช่นหากเราต้องการเลือกแถวNickและCorneliaตามด้วยคอลัมน์ 2 และ 4 เราสามารถใช้.locโดยการแปลงจำนวนเต็มเป็นป้ายกำกับโดยทำดังนี้:
col_names = df.columns[[2, 4]]
df.loc[['Nick', 'Cornelia'], col_names]
หรือมิฉะนั้นให้แปลงเลเบลดัชนีเป็นจำนวนเต็มด้วยget_locเมธอดดัชนี
labels = ['Nick', 'Cornelia']
index_ints = [df.index.get_loc(label) for label in labels]
df.iloc[index_ints, [2, 4]]
การเลือกบูลีน
ตัวสร้างดัชนี. loc ยังสามารถเลือกแบบบูลได้ ตัวอย่างเช่นหากเราสนใจหาแถวทั้งหมดที่อายุมากกว่า 30 ปีและส่งคืนเฉพาะคอลัมน์foodและscoreเราสามารถทำสิ่งต่อไปนี้:
df.loc[df['age'] > 30, ['food', 'score']]
คุณสามารถทำซ้ำสิ่งนี้ด้วย.ilocแต่คุณไม่สามารถผ่านชุดบูลีนได้ คุณต้องแปลง boolean Series เป็น array numpy ดังนี้:
df.iloc[(df['age'] > 30).values, [2, 4]]
การเลือกแถวทั้งหมด
มันเป็นไปได้ที่จะใช้.loc/.ilocสำหรับการเลือกคอลัมน์ คุณสามารถเลือกแถวทั้งหมดโดยใช้โคลอนเช่นนี้:
df.loc[:, 'color':'score':2]

ผู้ประกอบการจัดทำดัชนี[]สามารถชิ้นสามารถเลือกแถวและคอลัมน์ด้วย แต่ไม่พร้อมกัน
คนส่วนใหญ่คุ้นเคยกับวัตถุประสงค์หลักของโอเปอเรเตอร์การทำดัชนี DataFrame ซึ่งเป็นการเลือกคอลัมน์ สตริงเลือกคอลัมน์เดียวเป็นชุดและรายการสตริงเลือกหลายคอลัมน์เป็น DataFrame
df['food']
Jane Steak
Nick Lamb
Aaron Mango
Penelope Apple
Dean Cheese
Christina Melon
Cornelia Beans
Name: food, dtype: object
การใช้รายการเลือกหลายคอลัมน์
df[['food', 'score']]

สิ่งที่ผู้คนคุ้นเคยน้อยกว่าคือเมื่อใช้สัญกรณ์สไลซ์จะมีการเลือกเกิดขึ้นจากป้ายกำกับแถวหรือตามจำนวนเต็ม นี่เป็นสิ่งที่สับสนมากและสิ่งที่ฉันแทบจะไม่เคยใช้เลย แต่มันใช้ได้ผล
df['Penelope':'Christina'] # slice rows by label

df[2:6:2] # slice rows by integer location

ต้องการความชัดเจนใน.loc/.ilocการเลือกแถว ตัวดำเนินการการทำดัชนีเพียงอย่างเดียวไม่สามารถเลือกแถวและคอลัมน์พร้อมกันได้
df[3:5, 'color']
TypeError: unhashable type: 'slice'
คัดเลือกโดย.atและ.iat
การเลือกด้วย.atเกือบเหมือนกัน.locแต่จะเลือกเพียง 'เซลล์' เดียวใน DataFrame ของคุณ เรามักจะอ้างถึงเซลล์นี้ว่าเป็นค่าสเกลาร์ หากต้องการใช้.atให้ส่งทั้งป้ายกำกับแถวและคอลัมน์คั่นด้วยเครื่องหมายจุลภาค
df.at['Christina', 'color']
'black'
การเลือกด้วย.iatเกือบจะเหมือนกัน.ilocแต่จะเลือกค่าสเกลาร์เดียวเท่านั้น คุณต้องส่งจำนวนเต็มสำหรับทั้งที่ตั้งของแถวและคอลัมน์
df.iat[2, 5]
'FL'