Pandas 数据帧按索引切片

Posted

技术标签:

【中文标题】Pandas 数据帧按索引切片【英文标题】:Pandas dataframe slice by index 【发布时间】:2019-07-22 22:26:52 【问题描述】:

我正在尝试使用索引对数据帧进行切片,但由于 'TypeError: 'Int64Index([1], dtype='int64')' is an invalid key' 而出现错误

data = [['Alex', 10], ['Bob', 12], ['Clarke', 13]]
df = pd.DataFrame(data, columns=['Name', 'Age'])
index = df.index[df['Name'] == 'Bob']
print(index)
df = df.loc[index:]

错误:

df = df.loc[index:]
File "C:\Anaconda\lib\site-packages\pandas\core\indexing.py", line 1500, in __getitem__
return self._getitem_axis(maybe_callable, axis=axis)
File "C:\Anaconda\lib\site-packages\pandas\core\indexing.py", line 1867, in _getitem_axis
return self._get_slice_axis(key, axis=axis)
File "C:\Anaconda\lib\site-packages\pandas\core\indexing.py", line 1533, in _get_slice_axis
slice_obj.step, kind=self.name)
File "C:\Anaconda\lib\site-packages\pandas\core\indexes\base.py", line 4672, in slice_indexer
kind=kind)
File "C:\Anaconda\lib\site-packages\pandas\core\indexes\base.py", line 4871, in slice_locs
start_slice = self.get_slice_bound(start, 'left', kind)
File "C:\Anaconda\lib\site-packages\pandas\core\indexes\base.py", line 4801, in get_slice_bound
slc = self._get_loc_only_exact_matches(label)
File "C:\Anaconda\lib\site-packages\pandas\core\indexes\base.py", line 4771, in _get_loc_only_exact_matches
return self.get_loc(key)
File "C:\Anaconda\lib\site-packages\pandas\core\indexes\base.py", line 2656, in get_loc
return self._engine.get_loc(key)
File "pandas\_libs\index.pyx", line 108, in pandas._libs.index.IndexEngine.get_loc
File "pandas\_libs\index.pyx", line 110, in pandas._libs.index.IndexEngine.get_loc
TypeError: 'Int64Index([1], dtype='int64')' is an invalid key

打印索引给出 'Int64Index([1], dtype='int64')' 如何将其转换为 int 值。

https://pandas.pydata.org/pandas-docs/version/0.23.4/generated/pandas.Int64Index.html 上没有太多可用的文档

【问题讨论】:

您是否只想要数据框中NameBob 的行?为什么不只过滤掉以下行:df[df['Name'] == 'Bob'] 【参考方案1】:

如果你想从这个索引开始获取整个数据帧,试试这个:

df = df.loc[index[0]:]

如果您只想按名称获取行,请尝试:

df = df[df['Name'] == 'Bob']

【讨论】:

【参考方案2】:

对代码稍作修改

index = list(df.index[df['Name'] == 'Bob'])

应该给你职位。让我知道它是否有效

【讨论】:

【参考方案3】:

为此,您需要确保您的index 变量只包含一个整数,而不是其他可能包含多个值的对象(如果“Bob”出现多次)。在这种情况下,它只包含一个值,因为 'Bob' 在您的表中只出现一次,但您得到的是一个能够保存多个整数的 Int64Index 对象。你想要的只是一个普通的旧整数。

以下内容应该适用于您的表格,以及 Bob 确实出现多次的表格(它将选择出现“Bob”的第一行的索引):

index = (df['Name'] == 'Bob').idxmax()

idxmax 函数返回系列中价值最高的项目的索引(并且True 高于False,因此它返回名称为“Bob”的索引)。如果有两个或多个最大值,则返回第一个索引。

【讨论】:

以上是关于Pandas 数据帧按索引切片的主要内容,如果未能解决你的问题,请参考以下文章

pandas分层索引(层级索引MultiIndex)的创建取值切片统计计算以及普通索引和层级索引的转换方法

Python pandas 按多个索引范围切片数据帧

如何根据日期时间索引对 Pandas 数据框进行切片

使用索引值列表对 pandas 多索引数据框进行切片 [重复]

pandas:选择索引,然后选择多索引切片上的列

Pandas - 索引操作