如何选择带有索引标签的数据子集?
熊猫具有双重选择功能,可以使用“索引”位置或“索引”标签选择数据子集。在本文中,我将向您展示如何使用索引标签“使用索引标签选择数据子集”。
请记住,Python词典和列表是内置的数据结构,它们可以通过使用索引标签或按索引位置来选择其数据。字典的键必须是字符串,整数或元组,而列表必须使用整数(位置)或切片对象进行选择。
熊猫具有.loc和.iloc属性,可用于以自己独特的方式执行索引操作。)。使用.iloc属性,熊猫仅按位置选择,并且工作方式类似于Python列表。.loc属性仅按索引标签选择,这类似于Python词典的工作方式。
使用带有.loc[]的索引标签选择数据子集
loc和iloc属性在Series和DataFrame上均可用
导入以标题为索引的电影数据集。
import pandas as pd movies = pd.read_csv( "movies_data.csv", index_col="title", usecols=["title","budget","vote_average","vote_count"] )
我总是建议对索引进行排序,尤其是当索引由字符串组成时。如果在对索引进行排序时要处理巨大的数据集,则会注意到差异。
输入值
movies.sort_index(inplace = True) movies.head(3)
输出结果
我已经使用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"]
输出结果
budget 258000000.0 vote_average 5.9 vote_count 3576.0 Name: Spider-Man 3, dtype: float64
使用切片拉出许多值。我要去看那些没看过的电影。因为这是一个字符串标签,所以我们将获取搜索条件(包括“头像”)的所有数据。
切记-如果您使用Python列表,则最后一个值将被排除,但由于我们使用的是字符串,因此将包含在内。
movies.loc["Alien":"Avatar" ]
167行×3列
我可以得到不相邻的任意两部或更多部随机电影吗?肯定可以,但是您需要付出更多的努力来传递所需的电影列表。
我的意思是,您需要在方括号中包含方括号。
输入值
movies.loc[["Avatar", "Avengers: Age of Ultron"]]
我可以更改选择顺序吗?当然,您可以通过在订单中指定所需标签列表来帮助自己。
虽然这很酷,可以指定要提取的标签列表,但是您知道如果拼写错误的值会怎样?熊猫会因为拼写错误的标签而遗漏缺少值(NaN)。但是那些日子已经一去不复返了,它的最新更新引发了一个例外。
输入值
movies.loc[["Avengers: Age of Ultron","Avatar","When is Avengers next movie?"]]
--------------------------------------------------------------------------- KeyError Traceback (most recent call last) <ipython-input-21-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 raise ValueError("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 if not (ax.is_categorical() or ax.is_interval()): −> 1654 raise KeyError( 1655 "Passing list−likes to .loc or [] with any missing labels " 1656 "is no longer supported, see " KeyError: 'Passing list−likes to .loc or [] with any missing labels is no longer supported, see 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?')")