使用pandas get_loc更有效的方法?

时间:2018-02-21 16:39:37

标签: python pandas indexing

任务:在多列数据框中搜索值(所有值都是唯一的)并返回该行的索引。

目前:使用get_loc,但它似乎只允许一次传递一个列,从而导致一组相当无效的try except语句。虽然它有效,但有人知道更有效的方法吗?

var PlayerWithSprite = function (sprite) {    

    return function () {
        //What sprite to use    
        this.sprite = sprite;
        //initial x location
        this.x = 200;
        //initial y location
        this.y = 400;
    };
    
};

var Player = PlayerWithSprite('my-sprite');

var playerInstance = new Player();

console.log(playerInstance);

循环似乎不起作用,因为如果列不包含值,则引发KeyError。我查看了.contains或.isin等功能,但它是我感兴趣的位置索引。

5 个答案:

答案 0 :(得分:3)

您可以使用np.where,它会返回您的值存在的行和列索引元组。然后,您可以从中选择该行。

df =  pd.DataFrame(np.random.randint(0,100,size=(4, 4)), columns=list('ABCD'))
indices = np.where(df.values == 20)
rows = indices[0]
if len(rows) != 0:
    print(rows[0])

答案 1 :(得分:3)

请使用np.random.seed

来考虑此示例
np.random.seed([3, 1415])
df = pd.DataFrame(
    np.random.randint(200 ,size=(4, 4)),
    columns=list('ABCD'))

df

     A    B    C    D
0   11   98  123   90
1  143  126   55  141
2  139  141  154  115
3   63  104  128  120

我们可以使用np.where和切片找到您要查找的值。请注意,我使用了55的值,因为我从我选择的种子获得的数据中得到了。如果20位于您的数据集中,这将适用于i, j = np.where(df.values == 55) list(zip(df.index[i], df.columns[j])) [(1, 'C')] 。事实上,如果你有不止一个,它就会起作用。

(ngModelChange)

答案 2 :(得分:3)

使用向量化操作和布尔索引:

df[(df==20).any(axis=1)].index

答案 3 :(得分:3)

由于其他海报使用np.where(),我会使用any()提供另一种选择。

df.loc[df.isin([20]).any(axis=1)].index

如果符合条件,df.loc[*condition_here*]将返回TRUE,您可以使用any过滤到可能为真的行

所以这是我的df示例:

    A   B   C   D
0   82  7   48  90
1   68  18  90  14 #< ---- notice the 18 here
2   18  34  72  24 #< ---- notice the 18 here
3   69  73  40  86

df.isin([18])

    A   B   C   D
0   False   False   False   False
1   False   True    False   False  #<- ---- notice the TRUE value
2   True    False   False   False  #<- ---- notice the TRUE value
3   False   False   False   False


print(df.loc[df.isin([18]).any(axis=1)].index.tolist())
#output is a list
[1, 2]

答案 4 :(得分:3)

另一种方式

df[df.eq(20)].stack()
Out[1220]: 
1  C    20.0
dtype: float64