如何选择带有索引标签的数据子集?

熊猫具有双重选择功能,可以使用“索引”位置或“索引”标签选择数据子集。在本文中,我将向您展示如何使用索引标签“使用索引标签选择数据子集”。

请记住,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)

输出结果

标题预算平均投票投票数
(500天的夏日75000007.22904
克洛弗菲尔德巷10号150000006.82468
疯人院10天12000004.35

我已经使用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" ]


标题预算平均投票投票数
外星人110000007.94470
外星人区04.03
外星人:复活700000005.91365
外星人185000007.73220
阁楼上的外星人450000005.3244
------
澳大利亚1300000006.3694
自动对焦70000006.156
自动机70000005.6670
纽约的秋天650000005.7135
头像2370000007.211800

167行×3列

  • 我可以得到不相邻的任意两部或更多部随机电影吗?肯定可以,但是您需要付出更多的努力来传递所需的电影列表。

我的意思是,您需要在方括号中包含方括号。

输入值

movies.loc[["Avatar", "Avengers: Age of Ultron"]]


标题预算平均投票投票数
头像2370000007.211800
复仇者联盟:奥创纪元2800000007.36767
  • 我可以更改选择顺序吗?当然,您可以通过在订单中指定所需标签列表来帮助自己。

虽然这很酷,可以指定要提取的标签列表,但是您知道如果拼写错误的值会怎样?熊猫会因为拼写错误的标签而遗漏缺少值(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?')")


标题预算平均投票投票数
头像2370000007.211800