熊猫具有双重选择功能,可以使用索引位置或索引标签选择数据子集。在本文中,我将向您展示如何使用索引标签“使用索引标签选择数据子集”。
请记住,Python词典和列表是内置的数据结构,它们可以通过使用索引标签或按索引位置来选择其数据。字典的键必须是字符串,整数或元组,而列表必须使用整数(位置)或sliceobjects进行选择。
熊猫具有.loc和.iloc属性,可用于以自己独特的方式执行索引操作。)。使用.iloc属性,熊猫仅按位置进行选择,其工作方式类似于Python列表。.loc属性仅按索引标签选择,这类似于Python词典的工作方式。
loc和iloc属性在Series和DataFrame上均可用
导入以标题为索引的电影数据集。
import pandas as pd movies = 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)
预算#平均得分#标题#恐怖1500000 3.3 52(500)夏季天数7500000 7.2 2904 10克洛弗菲尔德巷15000000 6.8 2468
我已经使用sort_index和“ inplace = True”参数对索引进行了排序。
loc方法的语法有趣的一件事是,它不需要使用方parenthesis()
括号[]。我认为(可能是错误的)这是因为他们想要一致性,即可以在Series上使用[]来提取行,而在Dataframe上应用则可以获取列。
# extract "Spider-Man 3" ( I'm not a big fan of spidy) movies.loc["Spider-Man 3"]
预算258000000.0投票平均5.9投票数3576.0名称:蜘蛛侠3,dtype:float64
使用切片拉出许多值。我要去看那些没看过的电影。由于这是一个字符串标签,我们将获取搜索条件(包括“阿凡达”)的所有数据。
切记-如果您使用Python列表,则最后一个值将被排除,但由于我们使用的是字符串,因此将包含此值。
movies.loc["Alien":"Avatar"]
预算投票平均投票数标题外星人11000000 7.9 4470外星人区0 4.0 3外星人:复活70000000 5.9 1365外星人18500000 7.7 3220阁楼中的外星人45000000 5.3 244 ... ... ... ...澳大利亚130000000 6.3 694自动对焦7000000 6.1 56自动机7000000 5.6 670纽约秋季65000000 5.7 135阿凡达237000000 7.2 11800
167行×3列
能否获得不相邻的任意两部或更多部随机电影?肯定可以,但是您需要付出更多努力才能传递所需的电影列表。
我的意思是,您需要在方括号中包含方括号。
movies.loc[["Avatar","Avengers: Age of Ultron"]]
预算投票_平均投票_计数标题阿凡达237000000 7.2 11800复仇者联盟:奥创时代280000000 7.3 6767
我可以更改选择顺序吗?当然,您可以通过在订单中指定所需标签列表来帮助自己。
虽然这很酷,可以指定要提取的标签列表,但是您知道如果拼写错误的值会怎样?熊猫会因为拼写错误的标签而遗漏缺少值(NaN)。但是那些日子已经一去不复返了,最新的更新引发了一个例外。
movies.loc[["Avengers: Age of Ultron","Avatar","When is Avengers next movie?"]]
--------------------------------------------------------------------------- KeyError Traceback (most recent call last) <ipython-input-6-ebe975264840> in <module> ----> 1 movies.loc[["Avengers: Age of Ultron","Avatar","When is Avengers next movie?"]] ~\anaconda3\lib\site-packages\pandas\core\indexing.py in __getitem__ (self, key) 1766 1767 maybe_callable = com.apply_if_callable( key,self.obj) -> 1768 return self._getitem_axis(maybe_callable,axis = axis) 1769 1770 def_is_scalar_access(self,key:Tuple): ~\anaconda3\lib\site-packages\pandas\core\indexing.py in _getitem_axis (self, key, axis) 1952 raiseValueError("Cannot index with multidimensional key") 1953 -> 1954 return self._getitem_iterable(key, axis=axis) 1955 1956 # nested tuple slicing ~\anaconda3\lib\site-packages\pandas\core\indexing.py in_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 return self.obj._reindex_with_indexers( 1597 {axis:[keyarr,indexer]},copy=True,allow_dups=True ~\anaconda3\lib\site-packages\pandas\core\indexing.py in _get_listlike_indexer(self, key, axis, raise_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_missing 1554 ) ~\anaconda3\lib\site-packages\pandas\core\indexing.py in _validate_read_indexer (self, key, indexer, axis, raise_missing) 1652 # just raising 1653 ifnot(ax.is_categorical()orax.is_interval() ) : -> 1654 raise KeyError( 1655 "Passing list-likes to .loc or [] with any missing labels " 1656 "is no longer supported, see "
KeyError:“不再支持将列表喜欢的标签传递给.loc或[],并且缺少任何标签,请参见https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#deprecate-loc-reindex -listlike”
一种注意的方法是直接检查索引中的值。
"When is Avengers next movie?"in movies.index
假
如果您想忽略错误并继续前进,可以使用以下方法
movies.query("title in ('Avatar','When is Avengers next Movie?')")
预算投票_平均投票_计数标题阿凡达237000000 7.2 11800