Python 在不同的组中查找特定值的第一个匹配项

Python 在不同的组中查找特定值的第一个匹配项,python,pandas,Python,Pandas,我有一个玩具数据框,我有一列精度值和另一列组ID。我希望我能得到位置索引,对于每个组,精度值达到0.9。有人能帮忙吗 df = pd.DataFrame({"acc":[0.6,0.9,0.5,0.1,0.9,0.9], "id":[1,1,1, 2,2,2]}) 理想情况下,在这种情况下,我希望它返回索引位置1,4。检查删除重复项 idx = df[df.acc.eq(0.9)].drop_duplicates(

我有一个玩具数据框,我有一列精度值和另一列组ID。我希望我能得到位置索引,对于每个组,精度值达到0.9。有人能帮忙吗

df = pd.DataFrame({"acc":[0.6,0.9,0.5,0.1,0.9,0.9],
                   "id":[1,1,1, 2,2,2]})


理想情况下,在这种情况下,我希望它返回索引位置1,4。

检查
删除重复项

idx = df[df.acc.eq(0.9)].drop_duplicates('id').index
Out[64]: Int64Index([1, 4], dtype='int64')

检查
删除重复项

idx = df[df.acc.eq(0.9)].drop_duplicates('id').index
Out[64]: Int64Index([1, 4], dtype='int64')

以下代码为每个
id
查找
acc
超过
阈值的最早索引:

threshold = 0.9
df[df['acc'] >= threshold]\
    .sort_index()\
    .drop_duplicates(subset='id', keep='first')\
    .index
threshold = 0.9
df[df['acc'] >= threshold]\
    .sort_values(by='acc', ascending=True)\
    .drop_duplicates(subset='id', keep='first')\
    .index
不确定这两种方法之间的性能差异是什么,但实现相同结果的另一种方法是:

df.groupby('id').apply(lambda x: x[x['acc'] >= threshold].index.min()))
通过对第3行中的
acc
进行排序,我们可以发现,对于每个
id
acc
首先穿过
阈值的索引:

threshold = 0.9
df[df['acc'] >= threshold]\
    .sort_index()\
    .drop_duplicates(subset='id', keep='first')\
    .index
threshold = 0.9
df[df['acc'] >= threshold]\
    .sort_values(by='acc', ascending=True)\
    .drop_duplicates(subset='id', keep='first')\
    .index

以下代码为每个
id
查找
acc
超过
阈值的最早索引:

threshold = 0.9
df[df['acc'] >= threshold]\
    .sort_index()\
    .drop_duplicates(subset='id', keep='first')\
    .index
threshold = 0.9
df[df['acc'] >= threshold]\
    .sort_values(by='acc', ascending=True)\
    .drop_duplicates(subset='id', keep='first')\
    .index
不确定这两种方法之间的性能差异是什么,但实现相同结果的另一种方法是:

df.groupby('id').apply(lambda x: x[x['acc'] >= threshold].index.min()))
通过对第3行中的
acc
进行排序,我们可以发现,对于每个
id
acc
首先穿过
阈值的索引:

threshold = 0.9
df[df['acc'] >= threshold]\
    .sort_index()\
    .drop_duplicates(subset='id', keep='first')\
    .index
threshold = 0.9
df[df['acc'] >= threshold]\
    .sort_values(by='acc', ascending=True)\
    .drop_duplicates(subset='id', keep='first')\
    .index

df.index[df.acc==0.9]
?你是对的,但也许我给出了一个糟糕的例子,我更新了它。由于我希望在每组中选取第一个出现的0.9,因此在本例中,我希望它返回1,4。想法请?
df.index[df.acc==0.9]
?你是对的,但也许我给出了一个糟糕的例子,我更新了它。由于我希望在每组中选取第一个出现的0.9,因此在本例中,我希望它返回1,4。有什么好主意吗?谢谢,很有效!你能帮我把代码拆开一点吗?
.acc.eq(0.9)
是否发现第一个值等于0.9?
drop\u duplicates
是否删除不需要的行?drop\u duplicates将只保留每个id的第一个不重复值,即第一个索引与值0.9@EdwardLinnice匹配,如果我们想添加另一个条件,如另一个指标的阈值,比如所花费的时间,我们如何编写条件?谢谢,它可以工作!你能帮我把代码拆开一点吗?
.acc.eq(0.9)
是否发现第一个值等于0.9?那么,
drop_duplicates
是否删除不需要的行?drop_duplicates将只保留每个id的第一个不重复值,即第一个索引与值0.9@EdwardLinnice匹配,如果我们想添加另一个条件,如另一个指标的阈值,比如所花费的时间,我们如何编写条件?nice,如果我们想添加另一个条件,比如另一个指标的阈值,比如说花费的时间,我们如何编写条件?(刚刚意识到我不能在注释中输入多行…)我的第一个猜测是尝试修改过滤操作,例如,
df[(df['var1']>=threshold_1)&(df['var2']很好,如果我们想添加另一个条件,比如另一个指标的阈值,比如说花费的时间,我们如何编写条件?(刚刚意识到我不能在注释中输入多行…)我的第一个猜测是尝试修改过滤操作,例如,
df[(df['var1']>=threshold_1)&(df['var2']