熊猫数据帧按索引切片

时间:2019-02-28 22:29:54

标签: python pandas dataframe indexing slice

我正在尝试对具有索引的数据帧进行切片,但它给出错误,因为“ TypeError:'Int64Index([1],dtype ='int64')'是无效密钥”

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

上没有太多可用的文档

3 个答案:

答案 0 :(得分:1)

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

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

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

idxmax函数返回序列中价值最高的项目的索引(并且TrueFalse高,因此它返回名称为'Bob'的索引)。如果存在两个或多个最大值,则返回第一个索引。

答案 1 :(得分:0)

如果要从此索引开始获取整个数据帧,请尝试以下操作:

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

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

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

答案 2 :(得分:0)

对代码进行少量修改

#include <stdio.h>

int n,m,q;

int main(){
    scanf("%d %d",&n,&m);

    int PosFez[m];

    for(int i = 0; i < m; i++){
        scanf("%d",&PosFez[i]);
    }

    int Postos[n];
    for(int i = 0; i < n; i++){ 
        Postos[i] = 0;
    }


    scanf("%d",&q);

    int p[q];

    for(int i = 0; i<q;i++){
        scanf("%d",&p[i]);
    }

    for(int i = 0; i < m; i++){
        for(int j = 0; j < PosFez[i]; j++){
            Postos[j]++;
        }
    }   


    for(int i=0; i<q;i++){  
        printf("%d\n",Postos[PosFez[i]-1]);
    }
}

应该给你这个位置。让我知道它是否有效

相关问题