ในความคิดของฉันคำตอบที่ยอมรับนั้นสร้างความสับสนเนื่องจากใช้ DataFrame ที่มีค่าที่หายไป ฉันยังไม่ชอบคำที่ขึ้นอยู่กับตำแหน่งของคำศัพท์.iloc
แทนและชอบสถานที่จำนวนเต็มเพราะมันเป็นคำอธิบายที่มากขึ้นและสิ่งที่.iloc
หมายถึง คำสำคัญคือ INTEGER - .iloc
ต้องการ INTEGERS
ดูชุดบล็อกที่มีรายละเอียดสูงของฉันในการเลือกชุดย่อยสำหรับข้อมูลเพิ่มเติม
.ix เลิกใช้แล้วและคลุมเครือและไม่ควรใช้
เพราะ.ix
จะเลิกเราจะมุ่งเน้นไปที่ความแตกต่างระหว่างและ.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'