วัตถุประสงค์หลักคือเพื่อหลีกเลี่ยงการทำดัชนีที่ถูกล่ามโซ่และกำจัด SettingWithCopyWarning
จุดประสงค์หลักคือการหลีกเลี่ยงการจัดทำดัชนีถูกล่ามโซ่และกำจัด
การจัดทำดัชนีที่ถูกผูกมัดที่นี่เป็นสิ่งที่ต้องการ dfc['A'][0] = 111
เอกสารที่กล่าวว่าการจัดทำดัชนีถูกล่ามโซ่ที่ควรหลีกเลี่ยงในการกลับมามุมมองเมื่อเทียบกับสำเนา นี่คือตัวอย่างที่แก้ไขเล็กน้อยจากเอกสารนั้น:
In [1]: import pandas as pd
In [2]: dfc = pd.DataFrame({'A':['aaa','bbb','ccc'],'B':[1,2,3]})
In [3]: dfc
Out[3]:
A B
0 aaa 1
1 bbb 2
2 ccc 3
In [4]: aColumn = dfc['A']
In [5]: aColumn[0] = 111
SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame
In [6]: dfc
Out[6]:
A B
0 111 1
1 bbb 2
2 ccc 3
นี่aColumn
คือมุมมองและไม่ใช่สำเนาจาก DataFrame ดั้งเดิมดังนั้นการแก้ไขaColumn
จะทำให้ต้นฉบับdfc
ถูกแก้ไขด้วย ถัดไปถ้าเราสร้างดัชนีแถวแรก:
In [7]: zero_row = dfc.loc[0]
In [8]: zero_row['A'] = 222
SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame
In [9]: dfc
Out[9]:
A B
0 111 1
1 bbb 2
2 ccc 3
เวลาzero_row
นี้เป็นสำเนาดังนั้นต้นฉบับdfc
จะไม่ถูกแก้ไข
จากตัวอย่างสองตัวอย่างข้างต้นเราเห็นว่าไม่ชัดเจนว่าคุณต้องการเปลี่ยน DataFrame ดั้งเดิมหรือไม่ สิ่งนี้เป็นอันตรายอย่างยิ่งหากคุณเขียนสิ่งต่อไปนี้:
In [10]: dfc.loc[0]['A'] = 333
SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame
In [11]: dfc
Out[11]:
A B
0 111 1
1 bbb 2
2 ccc 3
คราวนี้มันไม่ทำงานเลย ที่นี่เราต้องการเปลี่ยนdfc
แต่จริง ๆ แล้วเราปรับเปลี่ยนค่ากลางdfc.loc[0]
ที่เป็นสำเนาและจะถูกยกเลิกทันที เป็นการยากมากที่จะคาดการณ์ว่าค่ากลางเช่นdfc.loc[0]
หรือdfc['A']
เป็นมุมมองหรือสำเนาดังนั้นจึงไม่รับประกันว่าจะมีการอัปเดต DataFrame ต้นฉบับหรือไม่ นั่นเป็นเหตุผลที่ควรหลีกเลี่ยงการทำดัชนีที่ถูกโยงโซ่และนุ่นสร้างSettingWithCopyWarning
สำหรับการปรับปรุงการจัดทำดัชนีแบบนี้
.copy()
ตอนนี้คือการใช้ หากต้องการกำจัดคำเตือนให้ทำสำเนาเพื่อแสดงเจตนาของคุณอย่างชัดเจน:
In [12]: zero_row_copy = dfc.loc[0].copy()
In [13]: zero_row_copy['A'] = 444 # This time no warning
เนื่องจากคุณกำลังแก้ไขสำเนาคุณจะรู้ว่าต้นฉบับdfc
จะไม่เปลี่ยนแปลงและคุณไม่คาดว่าจะมีการเปลี่ยนแปลง ความคาดหวังของคุณตรงกับพฤติกรรมจากนั้นSettingWithCopyWarning
จะหายไป
หมายเหตุหากคุณต้องการแก้ไข DataFrame ต้นฉบับเอกสารแนะนำให้คุณใช้loc
:
In [14]: dfc.loc[0,'A'] = 555
In [15]: dfc
Out[15]:
A B
0 555 1
1 bbb 2
2 ccc 3