ฉันสับสนกับวิธีการจัดทำดัชนีที่แตกต่างกันที่ใช้iloc
ในแพนด้า
สมมติว่าฉันกำลังพยายามแปลงดาต้าเฟรม 1 วันเป็นดาต้าเฟลมแบบ 2 มิติ ก่อนอื่นฉันมี Dataframe 1-d ต่อไปนี้
a_array = [1,2,3,4,5,6,7,8]
a_df = pd.DataFrame(a_array).T
และฉันจะไปแปลงที่เป็น 2 มิติ Dataframe 2x4
กับขนาดของ ฉันเริ่มต้นด้วยการตั้งค่า Dataframe 2 มิติดังต่อไปนี้:
b_df = pd.DataFrame(columns=range(4),index=range(2))
จากนั้นฉันใช้ for-loop เพื่อช่วยฉันแปลงa_df
(1-d) เป็นb_df
(2-d) ด้วยรหัสต่อไปนี้
for i in range(2):
b_df.iloc[i,:] = a_df.iloc[0,i*4:(i+1)*4]
มันให้ผลลัพธ์ต่อไปนี้กับฉันเท่านั้น
0 1 2 3
0 1 2 3 4
1 NaN NaN NaN NaN
แต่เมื่อฉันเปลี่ยนไปb_df.iloc[i,:]
b_df.iloc[i][:]
ผลลัพธ์นั้นถูกต้องเช่นนี้ซึ่งเป็นสิ่งที่ฉันต้องการ
0 1 2 3
0 1 2 3 4
1 5 6 7 8
ทุกคนสามารถอธิบายให้ฉันเข้าใจได้ว่าความแตกต่างระหว่าง.iloc[i,:]
และ.iloc[i][:]
คืออะไรและทำไมจึง.iloc[i][:]
ทำงานในตัวอย่างของฉันด้านบน แต่ไม่.iloc[i,:]
b_df.iloc[1] = a_df.iloc[0, 4:8]
กำหนดชุดที่มีค่าดัชนีชุดที่มีดัชนี[4, 5, 6, 7]
[0, 1, 2, 3]
ไม่มีการทับซ้อนดังนั้นจึงNaN
ได้รับมอบหมายให้องค์ประกอบทั้งหมด จนถึงจุดนี้มันสมเหตุสมผลสำหรับฉัน แต่เหมือนคุณฉันไม่มีความชัดเจนว่าทำไมถึงb_df.iloc[1][:] = ...
มีพฤติกรรมแตกต่างกัน - ตรวจสอบวัตถุb_df.iloc[1]
และb_df.iloc[1][:]
ไม่เปิดเผยความแตกต่างระหว่างดัชนี การคาดเดาที่ดีที่สุดของฉันคือการกำหนดให้คัดลอกโดยตรง ([:]
) จะถือว่าเป็นกรณีพิเศษโดย Pandas ซึ่งทำให้ไม่สนใจดัชนีของผู้รับโอนและสร้างความคลาดเคลื่อนนี้