Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

จะเลือกชุดย่อยของข้อมูลด้วย Index Labels ใน Python Pandas ได้อย่างไร


แนะนำตัว

นุ่นมีความสามารถในการเลือกคู่เพื่อเลือกชุดย่อยของข้อมูลโดยใช้ตำแหน่งดัชนีหรือโดยใช้ป้ายกำกับดัชนี ในโพสต์นี้ ฉันจะแสดงวิธี “เลือกชุดย่อยของข้อมูลโดยใช้ป้ายกำกับดัชนี” โดยใช้ป้ายกำกับดัชนี

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

นุ่นมีแอตทริบิวต์ .loc และ.iloc ที่พร้อมใช้สำหรับการดำเนินการดัชนีด้วยวิธีเฉพาะของตนเอง ). แอตทริบิวต์ With.iloc แพนด้าจะเลือกตามตำแหน่งเท่านั้นและทำงานเหมือนกับรายการ Python แอตทริบิวต์ .loc จะเลือกโดยป้ายกำกับดัชนีเท่านั้น ซึ่งคล้ายกับการทำงานของพจนานุกรม Python

เลือกชุดย่อยของข้อมูลโดยใช้ป้ายกำกับดัชนีด้วย .loc[]

แอตทริบิวต์ loc และ iloc มีอยู่ในทั้ง Series และ DataFrame

1.นำเข้าชุดข้อมูลภาพยนตร์ที่มีชื่อเรื่องเป็นดัชนี

นำเข้าแพนด้าเป็น pdmovies =pd.read_csv("https://raw.githubusercontent.com/sasankac/TestDataSet/master/movies_data.csv",index_col="title",usecols=["title","budget" ,"vote_average","vote_count"])

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

movies.sort_index(inplace =True)movies.head(3)


 งบประมาณ vote_average vote_counttitle___________________________________#Horror 1500000 3.3 52(500) Days of Summer 7500000 7.2 290410 Cloverfield Lane 15000000 6.8 2468

ฉันได้จัดเรียงดัชนีโดยใช้พารามิเตอร์ sort_index และ "inplace =True"

1. สิ่งหนึ่งที่น่าสนใจเกี่ยวกับไวยากรณ์ของวิธี loc คือไม่ใช้วงเล็บ () แทนที่จะใช้วงเล็บเหลี่ยม[] ฉันคิดว่า (อาจผิด) ที่เป็นเพราะพวกเขาต้องการความสม่ำเสมอ เช่น คุณสามารถใช้ [] ในซีรีส์เพื่อแยกส่วน ขณะที่ใช้กับ Dataframe จะดึงคอลัมน์มาให้คุณ

# สารสกัด "Spider-Man 3" (ฉันไม่ใช่แฟนตัวยงของสไปดี้)movies.loc["Spider-Man 3"]


งบประมาณ 2580000000.0vote_average 5.9vote_count 3576.0 ชื่อ:Spider-Man 3 dtype:float64

1. ใช้สไลซ์ดึงค่าต่างๆ ออกมา ฉันจะดึงหนังที่ฉันไม่ได้ดู เนื่องจากนี่คือป้ายกำกับสตริง เราจึงจะได้รับข้อมูลทั้งหมดสำหรับเกณฑ์การค้นหาของเรา รวมถึง "อวาตาร์"

ข้อควรจำ - หากคุณทำงานกับ Python List ค่าสุดท้ายจะถูกยกเว้น แต่เนื่องจากเรากำลังทำงานกับสตริง ค่านี้จะรวมอยู่ด้วย

movies.loc["Alien":"Avatar"]


งบประมาณ vote_average vote_counttitleAlien 11000000 7.9 4470Alien Zone 0 4.0 3Alien:Resurrection 70000000 5.9 1365Aliens 18500000 7.7 3220Aliens in the Attic 45000000 5.3 244... ... ... ...Australia 130000000 6.3 694Auto Focus 7000000 6.1 56Automata 7000000 5.6 670 ในนิวยอร์ก 65000000 5.7 135Avatar 237000000 7.2 11800

167 แถว × 3 คอลัมน์

1. ฉันสามารถรับภาพยนตร์ที่ไม่อยู่ติดกันสองเรื่องขึ้นไปโดยสุ่มได้หรือไม่? ใช่แน่นอน แต่คุณต้องพยายามมากขึ้นในการส่งรายชื่อภาพยนตร์ที่คุณต้องการ

ที่ฉันหมายถึงคือคุณต้องมีวงเล็บเหลี่ยมด้วยในวงเล็บเหลี่ยม

movies.loc[["Avatar","Avengers:Age of Ultron"]]
budget vote_average vote_counttitleAvatar 237000000 7.2 11800Avengers:Age of Ultron 280000000 7.3 6767

6. ฉันสามารถเปลี่ยนลำดับการเลือกได้หรือไม่? แน่นอน คุณสามารถช่วยตัวเองได้โดยการระบุรายการป้ายกำกับที่คุณต้องการตามลำดับ

แม้ว่าการระบุรายการป้ายกำกับที่คุณต้องการแยกจะดูดีมาก แต่คุณรู้ไหมว่าจะเกิดอะไรขึ้นหากคุณสะกดค่าผิด แพนด้าจะติด Values ​​(NaN) ที่หายไปสำหรับป้ายกำกับที่สะกดผิด แต่วันเหล่านั้นหายไปแล้ว การอัปเดตล่าสุดทำให้เกิดข้อยกเว้น

movies.loc[["Avengers:Age of Ultron","Avatar","เมื่อไรที่ภาพยนตร์เรื่องต่อไปของ Avengers?"]]


<ก่อนหน้า>------------------------------------------------------------- ---------------------------- KeyErrorTraceback (การโทรล่าสุดล่าสุด) ใน -- --> 1 movies.loc[["Avengers:Age of Ultron","Avatar","เมื่อ Avengers ภาพยนตร์เรื่องต่อไป?"]]~\anaconda3\lib\site-packages\pandas\core\indexing.py in__getitem__( ตัวเอง, คีย์)17661767 may_callable =com.apply_if_callable(key,self.obj)-> 1768return self._getitem_axis(maybe_callable,axis =axis)17691770 def_is_scalar_access(self,key:Tuple):~\anaconda3\lib\site-packages\ pandas\core\indexing.pyin_getitem_axis (ตัวเอง, คีย์, แกน) 1952 riseValueError ("ไม่สามารถสร้างดัชนีด้วยคีย์หลายมิติ") 1953-> 1954 ส่งคืน self._getitem_iterable (คีย์, แกน =แกน) 19551956 # การแยกทูเพิลที่ซ้อนกัน~\anaconda3\lib \site-packages\pandas\core\indexing.pyin_getitem_iterable(self, key, axis)1593 else:1594 # A collection of keys-> 1595 keyarr,indexer=self._get_listlike_indexer(key,axis,raise_missing=False)1596 ส่งคืนตัวเอง .obj._reindex_with_indexers (1597 {แกน:[keyarr,ind exer]},copy=True,allow_dups=True~\anaconda3\lib\site-packages\pandas\core\indexing.pyin_get_listlike_indexer(ตัวเอง, คีย์, แกน, ยก_missing)1550 keyarr,indexer, new_indexer=ax._reindex_non_unique(keyarr) 1551-> 1552 self._validate_read_indexer(1553 keyarr,indexer,o._get_axis_number(axis),raise_missing=raise_missing1554 )~\anaconda3\lib\site-packages\pandas\core\indexing.pyin_validate_read_indexer(ตัวเอง, คีย์, ตัวทำดัชนี, แกน, Raise_missing)1652 # แค่ raising1653 ifnot(ax.is_categorical()orax.is_interval()):-> 1654 ยก KeyError(1655 "การส่งต่อรายการไลค์ไปยัง .loc หรือ [] ที่มีป้ายกำกับ "1656" ขาดหายไปไม่ได้รับการสนับสนุนอีกต่อไป ดู "

KeyError:'ไม่รองรับการส่งรายการไลค์ไปยัง .loc หรือ [] ที่มีป้ายกำกับที่หายไป โปรดดู https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#deprecate-loc-reindex -listlike'

วิธีหนึ่งในการดูแลคือการตรวจสอบค่าในดัชนีโดยตรง

"ภาพยนตร์เรื่องต่อไปของอเวนเจอร์สเมื่อไร"ใน movies.index

ผลลัพธ์

เท็จ

หากคุณต้องการละเว้นข้อผิดพลาดและดำเนินการต่อไป คุณสามารถใช้แนวทางด้านล่าง

movies.query("ชื่อใน ('Avatar',' Avengers Next Movie เมื่อไหร่?')")


งบประมาณ vote_average คะแนนโหวต_counttitleAvatar 237000000 7.2 11800