如何在Python Pandas中使用索引标签选择数据子集?

介绍

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

请记住,Python词典和列表是内置的数据结构,它们可以通过使用索引标签或按索引位置来选择其数据。字典的键必须是字符串,整数或元组,而列表必须使用整数(位置)或sliceobjects进行选择。

熊猫具有.loc和.iloc属性,可用于以自己独特的方式执行索引操作。)。使用.iloc属性,熊猫仅按位置进行选择,其工作方式类似于Python列表。.loc属性仅按索引标签选择,这类似于Python词典的工作方式。

使用带有.loc []的索引标签选择数据子集

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

猜你喜欢