Pandas ใช้กฎอะไรในการสร้างมุมมองเทียบกับสำเนา


119

ฉันสับสนเกี่ยวกับกฎที่ Pandas ใช้เมื่อตัดสินใจว่าการเลือกจาก dataframe เป็นสำเนาของ dataframe ดั้งเดิมหรือมุมมองจากต้นฉบับ

ตัวอย่างเช่นถ้าฉันมี

df = pd.DataFrame(np.random.randn(8,8), columns=list('ABCDEFGH'), index=range(1,9))

ฉันเข้าใจว่าqueryส่งคืนสำเนาเพื่อให้เป็นเช่นนั้น

foo = df.query('2 < index <= 5')
foo.loc[:,'E'] = 40

จะไม่มีผลกับ dataframe ดั้งเดิม, df. ฉันยังเข้าใจว่าสเกลาร์หรือส่วนที่ตั้งชื่อส่งคืนมุมมองดังนั้นการมอบหมายให้กับสิ่งเหล่านี้เช่น

df.iloc[3] = 70

หรือ

df.ix[1,'B':'E'] = 222

จะเปลี่ยนdfไป แต่ฉันหลงทางเมื่อต้องเจอกับคดีที่ซับซ้อนกว่านี้ ตัวอย่างเช่น,

df[df.C <= df.B] = 7654321

การเปลี่ยนแปลงdfแต่

df[df.C <= df.B].ix[:,'B':'E']

ไม่.

มีกฎง่ายๆไหมที่นุ่นใช้ว่าฉันหายไป? เกิดอะไรขึ้นในกรณีเฉพาะเหล่านี้ และโดยเฉพาะอย่างยิ่งฉันจะเปลี่ยนค่าทั้งหมด (หรือส่วนย่อยของค่า) ในดาต้าเฟรมที่ตรงกับข้อความค้นหาหนึ่ง ๆ ได้อย่างไร (ตามที่ฉันพยายามทำในตัวอย่างสุดท้ายด้านบน)


หมายเหตุ: นี่คือไม่ได้เช่นเดียวกับคำถามนี้ ; และฉันได้อ่านเอกสารแต่ไม่ได้รู้แจ้ง ฉันได้อ่านคำถาม "ที่เกี่ยวข้อง" ในหัวข้อนี้เช่นกัน แต่ฉันยังขาดกฎง่ายๆที่ Pandas ใช้อยู่และฉันจะนำไปใช้อย่างไรเช่น - แก้ไขค่า (หรือส่วนย่อยของค่า) ในดาต้าเฟรมที่ตอบสนองการค้นหาเฉพาะ

คำตอบ:


138

นี่คือกฎการลบล้างในภายหลัง:

  • การดำเนินการทั้งหมดสร้างสำเนา

  • หากinplace=Trueมีให้มันจะแก้ไขในสถานที่ มีเพียงการดำเนินการบางอย่างเท่านั้นที่รองรับสิ่งนี้

  • ตัวสร้างดัชนีที่ตั้งค่าเช่น.loc/.iloc/.iat/.atจะตั้งค่าในตำแหน่ง

  • ตัวสร้างดัชนีที่ได้รับบนวัตถุ dtyped เดียวมักจะเป็นมุมมอง (ขึ้นอยู่กับเค้าโครงหน่วยความจำนั่นอาจไม่ใช่สาเหตุที่ไม่น่าเชื่อถือ) ทั้งนี้เพื่อประสิทธิภาพเป็นหลัก (เช่นจากข้างต้นสำหรับการ.queryนี้จะเสมอกลับสำเนาประเมินโดยการnumexpr)

  • ตัวสร้างดัชนีที่ได้รับบนวัตถุหลาย dtyped จะเป็นสำเนาเสมอ

ตัวอย่างของคุณ chained indexing

df[df.C <= df.B].loc[:,'B':'E']

ไม่รับประกันว่าจะได้ผล (ดังนั้นคุณ shoulld ไม่เคยทำเช่นนี้)

แทนที่จะทำ:

df.loc[df.C <= df.B, 'B':'E']

เนื่องจากเร็วกว่าและจะได้ผลเสมอ

การทำดัชนีแบบล่ามโซ่คือการดำเนินการของหลาม 2 รายการที่แยกจากกันดังนั้นแพนด้าจึงไม่สามารถดักจับได้อย่างน่าเชื่อถือ (คุณมักจะได้รับ SettingWithCopyWarningแต่ก็ไม่สามารถตรวจจับได้ 100% เช่นกัน) เอกสาร devซึ่งคุณชี้ให้คำอธิบายที่มากขึ้นอย่างเต็มรูปแบบ


3
.queryจะส่งคืนสำเนาทุกครั้งเนื่องจากสิ่งที่ทำ (ไม่ใช่มุมมอง) เพราะประเมินโดย n numexpr ดังนั้นฉันจะเพิ่มมันเข้าไปใน 'กฎ'
เจฟฟ์

3
แพนด้าอาศัยตัวเลขในการพิจารณาว่าจะสร้างมุมมองหรือไม่ ในกรณี dtype เดียว (ซึ่งอาจเป็น 1-d สำหรับอนุกรม, 2-d สำหรับเฟรม ฯลฯ ) numpy อาจสร้างมุมมอง ขึ้นอยู่กับว่าคุณกำลังหั่นอะไร บางครั้งคุณอาจได้รับมุมมองและบางครั้งคุณก็ทำไม่ได้ แพนด้าไม่ได้อาศัยข้อเท็จจริงนี้เลยเนื่องจากไม่ชัดเจนเสมอไปว่าจะมีการสร้างมุมมองหรือไม่ แต่สิ่งนี้ไม่สำคัญเนื่องจาก loc ไม่พึ่งพาสิ่งนี้เมื่อตั้งค่า อย่างไรก็ตามเมื่อการจัดทำดัชนีลูกโซ่สิ่งนี้สำคัญมาก (และเหตุใดการจัดทำดัชนีโซ่จึงไม่ดี)
เจฟฟ์

3
ขอบคุณเจฟฟ์มากคำตอบของคุณมีประโยชน์มากที่สุด แหล่งที่มา / ข้อมูลอ้างอิงของคุณในหัวข้อนี้คืออะไร?
Kamixave

4
ก่อนอื่นขอขอบคุณสำหรับการทำงานที่ยอดเยี่ยมของคุณ! และอย่างที่สองถ้าคุณมีเวลาเพียงพอฉันคิดว่าการเพิ่มย่อหน้าที่คล้ายกับคำตอบหลักของคุณในเอกสารจะเป็นการดี
Kamixave

2
แน่นอนจะใช้คำขอแบบดึงเพื่อเพิ่ม / แก้ไขเอกสาร ไปเลย
เจฟฟ์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.