วิธีแก้ไขใน pandas: settingwithcopywarning


คำเตือนประการหนึ่งที่คุณอาจพบเมื่อใช้แพนด้าคือ:

 SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.

คำเตือนนี้จะปรากฏขึ้นเมื่อแพนด้าพบกับสิ่งที่เรียกว่าการกำหนดลูกโซ่ ซึ่งเป็นการผสมผสานระหว่างการผูกมัดและการมอบหมายในขั้นตอนเดียว

สิ่งสำคัญคือต้องทราบว่านี่เป็นเพียง คำเตือน ไม่ใช่ข้อผิดพลาด รหัสของคุณจะยังคงทำงานต่อไป แต่ผลลัพธ์อาจไม่เป็นอย่างที่คุณคาดหวังเสมอไป

วิธีที่ง่ายที่สุดในการระงับคำเตือนนี้คือการใช้โค้ดต่อไปนี้:

 p.d. options . fashion . chained_assignment = None

ตัวอย่างต่อไปนี้แสดงวิธีการตอบสนองต่อคำเตือนนี้ในทางปฏิบัติ

วิธีทำซ้ำคำเตือน

สมมติว่าเราสร้าง DataFrame แพนด้าต่อไปนี้:

 import pandas as pd

#createDataFrame
df = pd. DataFrame ({' A ': [25, 12, 15, 14, 19, 23, 25, 29],
                   ' B ': [5, 7, 7, 9, 12, 9, 9, 4],
                   ' C ': [11, 8, 10, 6, 6, 5, 9, 12]})

#view DataFrame
df

	A B C
0 25 5 11
1 12 7 8
2 15 7 10
3 14 9 6
4 19 12 6
5 23 9 5
6 25 9 9
7 29 4 12

ตอนนี้ สมมติว่าเราสร้าง DataFrame ใหม่ที่มีเฉพาะคอลัมน์ “A” จาก DataFrame ดั้งเดิม และหารแต่ละค่าในคอลัมน์ “A” ด้วย 2:

 #define new DataFrame
df2 = df[[' A ']]

#divide all values in column 'A' by 2
df2[' A '] = df[' A '] / 2

/srv/conda/envs/notebook/lib/python3.7/site-packages/ipykernel_launcher.py:2:
SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

เราได้รับข้อความ SettingWithCopyWarning เนื่องจากเรากำลังตั้งค่าใหม่สำหรับคอลัมน์ “A” บน “ส่วน” ของ DataFrame ดั้งเดิม

อย่างไรก็ตาม หากเราดู DataFrame ใหม่ที่เราสร้างขึ้น เราจะเห็นว่าแต่ละค่าได้ถูกหารด้วย 2 เรียบร้อยแล้ว:

 #view new DataFrame
df2

     HAS
0 12.5
1 6.0
2 7.5
3 7.0
4 9.5
5 11.5
6 12.5
7 14.5

แม้ว่าเราจะได้รับข้อความเตือน แต่แพนด้าก็ยังคงทำในสิ่งที่เราคิดว่าจะทำ

วิธีหลีกเลี่ยงคำเตือน

เพื่อหลีกเลี่ยงคำเตือนนี้ ขอแนะนำให้ใช้ไวยากรณ์ .loc[row indexer, col indexer] ดังต่อไปนี้:

 #define new DataFrame
df2 = df. loc [:,[' A ']]

#divide each value in column 'A' by 2
df2[' A '] = df[' A '] / 2

#view result
df2

     HAS
0 12.5
1 6.0
2 7.5
3 7.0
4 9.5
5 11.5
6 12.5
7 14.5

DataFrame ใหม่ประกอบด้วยค่าทั้งหมดจากคอลัมน์ “A” ใน DataFrame ดั้งเดิมหารด้วยสองและไม่มีข้อความเตือนปรากฏขึ้น

หากเราต้องการป้องกันไม่ให้แสดงข้อความเตือน เราสามารถใช้โค้ดต่อไปนี้:

 #prevent SettingWithCopyWarning message from appearing
p.d. options . fashion . chained_assignment = None

สำหรับคำอธิบายโดยละเอียดว่าเหตุใดจึงควรหลีกเลี่ยงการมอบหมาย ลูกโซ่ โปรดดูเอกสารแพนด้าออนไลน์

แหล่งข้อมูลเพิ่มเติม

วิธีแก้ไข: ไม่มีโมดูลชื่อแพนด้า
วิธีแก้ไข: ไม่มีโมดูลชื่อ numpy
วิธีแก้ไข: คอลัมน์ซ้อนทับกันแต่ไม่ได้ระบุส่วนต่อท้าย

เพิ่มความคิดเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *