การจัดทำดัชนี Pandas และข้อผิดพลาดของคีย์

พิจารณาสิ่งต่อไปนี้:

d = {'a': 0.0, 'b': 1.0, 'c': 2.0}

e = pd.Series(d, index = ['a', 'b', 'c'])

df = pd.DataFrame({ 'A' : 1.,'B' : e,'C' :pd.Timestamp('20130102')}).

เมื่อฉันพยายามเข้าถึงแถวแรกของคอลัมน์ B ด้วยวิธีต่อไปนี้:

>>> df.B[0]
0.0

ฉันได้รับผลลัพธ์ที่ถูกต้อง

อย่างไรก็ตาม หลังจากอ่าน KeyError: 0 เมื่อเข้าถึงค่าในชุด pandas ฉันอยู่ภายใต้สมมติฐานว่าเนื่องจากฉันได้ระบุดัชนีเป็น 'a', 'b' และ 'c' วิธีที่ถูกต้องในการเข้าถึงแถวแรกของคอลัมน์ B (โดยใช้อาร์กิวเมนต์ตำแหน่ง) คือ: df.B.iloc[0] และ df.B[0] ควรทำให้เกิดข้อผิดพลาดที่สำคัญ ฉันไม่รู้ว่าฉันขาดอะไรไป ใครช่วยอธิบายได้ไหมว่าฉันจะได้รับข้อผิดพลาดที่สำคัญในกรณีใด


person Yash    schedule 20.07.2018    source แหล่งที่มา
comment
คุณควรใช้ loc หรือ at ดูข้อมูลเพิ่มเติมได้ที่ stackoverflow.com/questions/48035493/   -  person cs95    schedule 20.07.2018


คำตอบ (3)


ปัญหาในคำถามที่คุณอ้างอิงคือดัชนีของ dataframe ที่ระบุเป็นจำนวนเต็ม แต่ไม่ได้เริ่มจาก 0

พฤติกรรมของ Pandas เมื่อถามถึง df.B[0] นั้นคลุมเครือ และขึ้นอยู่กับประเภทข้อมูลของดัชนีและประเภทข้อมูลที่ส่งไปยังไวยากรณ์ของการแบ่งส่วน Python มันสามารถทำงานเหมือน df.B.loc[0] (ตามป้ายกำกับดัชนี) หรือ df.B.iloc[0] (ตามตำแหน่ง) หรืออาจเป็นอย่างอื่นที่ฉันไม่รู้ สำหรับพฤติกรรมที่คาดเดาได้ ฉันแนะนำให้ใช้ loc และ iloc

เพื่ออธิบายสิ่งนี้ด้วยตัวอย่างของคุณ:

d = [0.0, 1.0, 2.0]
e = pd.Series(d, index = ['a', 'b', 'c'])
df = pd.DataFrame({'A': 1., 'B': e, 'C': pd.Timestamp('20130102')})

df.B[0] # 0.0 - fall back to position based
df.B['0'] # KeyError - no label '0' in index
df.B['a'] # 0.0 - found label 'a' in index
df.B.loc[0] # TypeError - string index queried by integer value
df.B.loc['0'] # KeyError - no label '0' in index
df.B.loc['a'] # 0.0 - found label 'a' in index
df.B.iloc[0] # 0.0 - position based query for row 0
df.B.iloc['0'] # TypeError - string can't be used for position
df.B.iloc['a'] # TypeError - string can't be used for position

พร้อมตัวอย่างจากบทความอ้างอิง:

d = [0.0, 1.0, 2.0]
e = pd.Series(d, index = [4, 5, 6])
df = pd.DataFrame({'A': 1., 'B': e, 'C': pd.Timestamp('20130102')})

df.B[0] # KeyError - label 0 not in index
df.B['0'] # KeyError - label '0' not in index
df.B.loc[0] # KeyError - label 0 not in index
df.B.loc['0'] # KeyError - label '0' not in index
df.B.iloc[0] # 0.0 - position based query for row 0
df.B.iloc['0'] # TypeError - string can't be used for position
person Justinas Marozas    schedule 20.07.2018

df.B ส่งคืนซีรี่ส์ pandas ซึ่งเป็นสาเหตุที่คุณสามารถจัดทำดัชนีตำแหน่งได้ หากคุณเลือกคอลัมน์ B เป็น dataframe สิ่งนี้จะทำให้เกิดข้อผิดพลาด:

df[['B']][0]
person xyzjayne    schedule 20.07.2018

df.B จริงๆ แล้วคือวัตถุ pandas.Series (ทางลัดสำหรับ df['B']) ซึ่งสามารถวนซ้ำได้ df.B[0] ไม่ได้เป็น "แถว" อีกต่อไป แต่เป็นเพียงองค์ประกอบแรกของ df.B เนื่องจากโดยการเขียน df.B คุณจะสร้างวัตถุ 1-D โดยพื้นฐานแล้ว

ข้อมูลเพิ่มเติมในเอกสารประกอบโครงสร้างข้อมูล

คุณสามารถปฏิบัติต่อ DataFrame เชิงความหมายได้เหมือนกับคำสั่งของอ็อบเจ็กต์ Series ที่มีการจัดทำดัชนีเหมือนกัน

person NiGiord    schedule 20.07.2018
comment
ใช่ องค์ประกอบของซีรีส์แพนด้าสามารถรับได้จากการจัดทำดัชนีโดยตรง - person Rohith; 20.07.2018