เชี่ยวชาญการแปลงข้อมูลใน Pandas ด้วยเทคนิคที่มีประโยชน์ทั้งสามนี้

เจาะลึกการกรอง การจัดการ และการทำงาน

ภาพถ่ายโดย มิลาด ฟาคูเรียน on Unsplash

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

เป็นเรื่องดีจนกว่าคุณจะหลุดออกจากฝันกลางวันและกลับมาซ่อมแซมต่อโดยพบกับแถวที่พังทลายและป้ายไร้สาระที่อยู่ตรงหน้าคุณ

ไม่มีสิ่งที่เรียกว่าข้อมูลที่สะอาด (ในรูปแบบดั้งเดิม) หากคุณเป็นนักวิทยาศาสตร์ข้อมูล คุณจะรู้สิ่งนี้ หากคุณเพิ่งเริ่มต้นคุณควรยอมรับสิ่งนี้ คุณจะต้องแปลงข้อมูลของคุณเพื่อให้สามารถทำงานกับข้อมูลได้อย่างมีประสิทธิภาพ

เรามาพูดถึงสามวิธีในการทำเช่นนั้น

การกรอง — แต่อธิบายอย่างถูกต้อง

มาพูดถึงการกรองกันดีกว่า แต่ให้ลึกกว่าที่คุณคุ้นเคยเล็กน้อย เนื่องจากเป็นหนึ่งในการดำเนินการแปลงข้อมูลที่ใช้กันทั่วไปและมีประโยชน์มากที่สุด การกรองอย่างมีประสิทธิภาพจึงเป็นทักษะที่นักวิทยาศาสตร์ข้อมูลทุกคนต้องมี หากคุณรู้จักแพนด้า ก็อาจเป็นหนึ่งในปฏิบัติการแรกๆ ที่คุณเรียนรู้ที่จะทำ

มาทบทวนโดยใช้ตัวอย่างที่ฉันชอบและหลากหลายอย่างแปลกประหลาด: DataFrame ของเกรดของนักเรียน ที่เรียกว่าเหมาะเจาะ grades:

รูปภาพโดยผู้เขียน

เราจะกรองคะแนนที่ต่ำกว่า 90 ออก เพราะในวันนี้เราได้ตัดสินใจที่จะเป็นนักการศึกษาที่ได้รับการฝึกอบรมมาไม่ดี ซึ่งจะให้บริการเฉพาะนักเรียนที่เก่งเท่านั้น (โปรดอย่าทำเช่นนี้จริงๆ เลย) บรรทัดโค้ดมาตรฐานสำหรับการดำเนินการนี้มีดังนี้:

เกรด[เกรด['คะแนน'] >= 90]
รูปภาพโดยผู้เขียน

นั่นทำให้เราอยู่กับแจ็คและเฮอร์ไมโอนี่ เย็น. แต่เกิดอะไรขึ้นที่นี่กันแน่? Why บรรทัดโค้ดด้านบนใช้งานได้หรือไม่ มาเจาะลึกลงไปอีกหน่อยโดยดูผลลัพธ์ของนิพจน์ภายในวงเล็บด้านนอกด้านบน:

เกรด['คะแนน'] >= 90
รูปภาพโดยผู้เขียน

อ่าโอเค. นั่นสมเหตุสมผลแล้ว ปรากฏว่าบรรทัดโค้ดนี้ส่งคืนวัตถุ Pandas Series ที่เก็บบูลีน ( True / False ) ค่าที่กำหนดโดยอะไร >= 90 ส่งคืนสำหรับแต่ละแถว นี่คือขั้นตอนกลางที่สำคัญ หลังจากนั้นเป็นชุดบูลีนซึ่งจะถูกส่งผ่านไปยังวงเล็บด้านนอก และกรองแถวทั้งหมดตามนั้น

เพื่อให้เสร็จสมบูรณ์ ฉันจะพูดถึงว่าพฤติกรรมเดียวกันนี้สามารถทำได้โดยใช้ loc คำสำคัญ:

grades.loc[เกรด['คะแนน'] >= 90]
รูปภาพโดยผู้เขียน

มีสาเหตุหลายประการที่เราอาจเลือกใช้ loc (ซึ่งหนึ่งในนั้นคือช่วยให้เราสามารถกรองแถวและคอลัมน์ผ่านการดำเนินการเพียงครั้งเดียว) แต่นั่นเป็นการเปิดการดำเนินการ Box of Pandas ของ Pandora ที่ดีที่สุดเหลือไว้สำหรับบทความอื่น

สำหรับตอนนี้ เป้าหมายการเรียนรู้ที่สำคัญคือ เมื่อเรากรอง Pandas ไวยากรณ์ที่น่าสับสนไม่ใช่สิ่งมหัศจรรย์อะไรสักอย่าง เราเพียงแค่ต้องแบ่งมันออกเป็นสองขั้นตอน: 1) รับชุดบูลีนของแถวที่ตรงตามเงื่อนไขของเรา และ 2) ใช้ชุดเพื่อกรอง DataFrame ทั้งหมด

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

ไปกันเถอะ

ความงามของฟังก์ชันแลมบ์ดา

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

เข้าสู่ฟังก์ชัน lambda ซึ่งเป็นฟีเจอร์ภาษาที่มีประโยชน์ซึ่งผสานรวมกับ Pandas ได้อย่างสวยงาม

เพื่อเป็นการทบทวนสั้นๆ ต่อไปนี้คือวิธีการทำงานของแลมบ์ดา:

>>> add_function = แลมบ์ดา x, y: x + y
>>> add_function(2, 3)
5

ฟังก์ชัน Lambda ก็ไม่ต่างจากฟังก์ชันทั่วไป ยกเว้นว่าฟังก์ชันเหล่านี้มีไวยากรณ์ที่กระชับมากกว่า:

  • ชื่อฟังก์ชันทางด้านซ้ายของเครื่องหมายเท่ากับ
  • พื้นที่ lambda คำหลักทางด้านขวาของเครื่องหมายเท่ากับ (คล้ายกับ def ในคำจำกัดความฟังก์ชัน Python แบบดั้งเดิม ซึ่งจะทำให้ Python รู้ว่าเรากำลังกำหนดฟังก์ชัน)
  • พารามิเตอร์หลัง lambda คำหลักทางด้านซ้ายของเครื่องหมายทวิภาค
  • ส่งกลับค่าทางด้านขวาของเครื่องหมายทวิภาค

ต่อไป ลองใช้ฟังก์ชันแลมบ์ดากับสถานการณ์จริงกัน

ชุดข้อมูลมักจะมีรูปแบบเฉพาะของตัวเอง โดยเฉพาะการป้อนข้อมูลและการรวบรวมรูปแบบต่างๆ ด้วยเหตุนี้ ข้อมูลที่คุณกำลังทำงานอยู่อาจมีปัญหาเฉพาะเจาะจงแปลกๆ ที่คุณต้องแก้ไข ตัวอย่างเช่น ลองพิจารณาชุดข้อมูลง่ายๆ ด้านล่าง ซึ่งจัดเก็บชื่อบุคคลและรายได้ของพวกเขา ลองเรียกมันว่า monies.

รูปภาพโดยผู้เขียน

ขณะนี้ ในฐานะ Master Data Highnesses ของบริษัทนี้ เราได้รับข้อมูลลับสุดยอด: ทุกคนในบริษัทนี้จะได้รับการเพิ่มเงิน 10% บวกด้วยเงินเพิ่มอีก 1000 ดอลลาร์ นี่อาจเป็นการคำนวณเฉพาะเจาะจงเกินกว่าจะหาวิธีการเฉพาะได้ แต่ก็ตรงไปตรงมาเพียงพอสำหรับฟังก์ชันแลมบ์ดา:

update_income = แลมบ์ดา num: num + (num * .10) + 1000

จากนั้น สิ่งที่เราต้องทำคือใช้ฟังก์ชันนี้กับแพนด้า apply ซึ่งทำให้เราใช้ฟังก์ชันกับทุกองค์ประกอบของซีรี่ส์ที่เลือกได้:

เงิน['รายได้ใหม่'] = เงิน['รายได้'].apply(update_income)
เงิน
รูปภาพโดยผู้เขียน

และเราทำเสร็จแล้ว! DataFrame ใหม่ที่ยอดเยี่ยมประกอบด้วยข้อมูลที่เราต้องการ ทั้งหมดนี้อยู่ในโค้ดสองบรรทัด เพื่อให้กระชับยิ่งขึ้น เราอาจกำหนดฟังก์ชันแลมบ์ดาไว้ข้างในก็ได้ apply โดยตรง — เคล็ดลับดีๆ ที่ควรคำนึงถึง

ฉันจะรักษาประเด็นนี้ให้เรียบง่าย

Lambdas มีประโยชน์อย่างยิ่ง ดังนั้นคุณจึงควรใช้มัน สนุก!

ฟังก์ชันการจัดการสตริงแบบอนุกรม

ในส่วนก่อนหน้านี้ เราได้พูดคุยเกี่ยวกับความอเนกประสงค์ของฟังก์ชัน lambda และสิ่งดีๆ ทั้งหมดที่ฟังก์ชันเหล่านี้สามารถช่วยให้คุณบรรลุผลสำเร็จด้วยข้อมูลของคุณ นี่สุดยอดเลย แต่ คุณควรระวังอย่าให้ถูกพาตัวไป เป็นเรื่องปกติอย่างไม่น่าเชื่อที่จะจมอยู่กับวิธีการทำสิ่งที่คุณคุ้นเคยโดยที่คุณพลาดการใช้ทางลัดที่เรียบง่ายกว่าที่ Python ได้ให้พรแก่โปรแกรมเมอร์ แน่นอนว่าสิ่งนี้ใช้ได้กับมากกว่าแลมบ์ดา แต่เราจะยึดถือสิ่งนั้นอยู่ในขณะนี้

ตัวอย่างเช่น สมมติว่าเราเรียก DataFrame ต่อไปนี้ names ซึ่งเก็บชื่อและนามสกุลของบุคคล:

รูปภาพโดยผู้เขียน

ขณะนี้ เนื่องจากข้อจำกัดด้านพื้นที่ในฐานข้อมูลของเรา เราตัดสินใจว่าแทนที่จะจัดเก็บนามสกุลทั้งหมดของบุคคล จะมีประสิทธิภาพมากกว่าในการจัดเก็บชื่อย่อนามสกุลของพวกเขา ดังนั้นเราจึงต้องแปลงร่าง 'Last Name' คอลัมน์ตามลำดับ สำหรับ lambdas ความพยายามของเราในการทำเช่นนั้นอาจมีลักษณะดังนี้:

ชื่อ['นามสกุล'] = ชื่อ['นามสกุล'].สมัคร(แลมบ์ดา s: s[:1])
ชื่อ
รูปภาพโดยผู้เขียน

มันใช้งานได้ชัดเจน แต่มันค่อนข้างจะเทอะทะนิดหน่อย ดังนั้นจึงไม่ใช่ Pythonic เท่าที่ควร โชคดีที่ฟังก์ชันการจัดการสตริงที่สวยงามใน Pandas มีอีกวิธีหนึ่งที่หรูหรากว่า (สำหรับจุดประสงค์ของโค้ดบรรทัดถัดไป เพียงดำเนินการต่อและถือว่าเรายังไม่ได้แก้ไข 'Last Name' คอลัมน์ที่มีโค้ดด้านบน):

ชื่อ['นามสกุล'] = ชื่อ['นามสกุล'].str[:1]
ชื่อ
รูปภาพโดยผู้เขียน

ทาดา! ที่ .str คุณสมบัติของ Pandas Series ช่วยให้เราสามารถประกบทุกสตริงในซีรีส์ด้วยการดำเนินการสตริงที่ระบุ เหมือนกับว่าเราทำงานกับแต่ละสตริงแยกกัน

แต่เดี๋ยวก่อนมันจะดีขึ้น เนื่องจาก .str ช่วยให้เราเข้าถึงการทำงานปกติของสตริงผ่าน Series ได้อย่างมีประสิทธิภาพ เรายังสามารถใช้ฟังก์ชันสตริงต่างๆ เพื่อช่วยประมวลผลข้อมูลของเราได้อย่างรวดเร็ว! ตัวอย่างเช่น สมมติว่าเราตัดสินใจแปลงทั้งสองคอลัมน์เป็นตัวพิมพ์เล็ก รหัสต่อไปนี้ทำงาน:

ชื่อ['ชื่อ'] = ชื่อ['ชื่อ'].str.lower()
ชื่อ['นามสกุล'] = ชื่อ['นามสกุล'].str.lower()
ชื่อ
รูปภาพโดยผู้เขียน

ตรงไปตรงมามากกว่าการต้องผ่านความยุ่งยากในการกำหนดฟังก์ชันแลมบ์ดาของคุณเองและเรียกใช้ฟังก์ชันสตริงที่อยู่ภายใน ไม่ใช่ว่าฉันไม่ชอบ lambdas แต่ทุกอย่างมีที่ของมัน และความเรียบง่ายควรมีความสำคัญเป็นลำดับแรกใน Python เสมอ

ฉันได้กล่าวถึงตัวอย่างบางส่วนเท่านั้นที่นี่ แต่ มีฟังก์ชันสตริงมากมายให้คุณเลือกใช้งาน [1]

ใช้พวกเขาอย่างเสรี พวกเขายอดเยี่ยมมาก

ความคิดสุดท้ายและบทสรุป

ต่อไปนี้เป็นเอกสารสรุปการแปลงข้อมูลเล็กๆ น้อยๆ สำหรับคุณ:

  1. กรองตามที่คุณหมายถึง. เรียนรู้ว่าจริงๆ แล้วเกิดอะไรขึ้นเพื่อให้คุณรู้ว่าคุณกำลังทำอะไรอยู่
  2. รักลูกแกะของคุณ. พวกเขาสามารถช่วยคุณจัดการข้อมูลด้วยวิธีที่น่าทึ่ง
  3. แพนด้าก็รักสายอักขระมากเท่ากับคุณ. มีฟังก์ชันในตัวมากมาย คุณก็สามารถใช้งานได้เช่นกัน

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

ฉันขอแนะนำให้คุณออกไปหาอะไรเพิ่มเติม

อ้างอิง

[1] https://www.aboutdatablog.com/post/10-most-useful-string-functions-in-pandas

การแปลงข้อมูลหลักใน Pandas ด้วยเทคนิคที่มีประโยชน์ทั้งสามนี้ เผยแพร่ซ้ำจากแหล่งที่มา https://towardsdatascience.com/master-data-transformation-in-pandas-with-these-three-useful-techniques-20699f03e51d?source=rss—-7f60cf5620c9— 4 ทาง https://towardsdatascience.com/feed

<!–

->

ประทับเวลา:

เพิ่มเติมจาก ที่ปรึกษาบล็อคเชน