获取m个值中的n个值错误的行

2024-06-25 06:46:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样一个数据帧:

right_answer   rater1   rater2   rater3   item
1              1        1        2        S01
1              1        2        2        S02
2              1        2        1        S03
2              2        1        2        S04

我需要得到“项目”中的行或值,其中至少有三分之二的评分者给出了错误的答案。我已经可以检查所有评分员是否同意此代码:

df.where(df[['rater1', 'rater2', 'rater3']].eq(df.iloc[:, 0], axis=0).all(1) == True)

我不想计算一个有多数票的专栏,因为也许我需要调整那些同意或不同意正确答案的评分者的数量

谢谢你的帮助


Tags: 数据项目答案answerrightdfitem评分
2条回答

使用^{}过滤包含rater等列的数据框,然后使用^{}沿axis=0比较包含rater的列与right_answer列,然后使用^{}沿axis=1获取给出错误答案的raters数,然后使用^{}创建布尔掩码,最后使用此筛选数据框行mask

mask = (
    df.filter(like='rater')
    .ne(df['right_answer'], axis=0).sum(axis=1).ge(2)
)

df = df[mask]

结果:

# print(df)

   right_answer  rater1  rater2  rater3 item
1             1       1       2       2  S02
2             2       1       2       1  S03

为了提高速度,纯粹使用^{}

diffs = np.not_equal(df.filter(like='rater'), df['right_answer'][:, None])
diffs = np.sum(diffs, axis=1) >= 2

df[diffs]

   right_answer  rater1  rater2  rater3 item
1             1       1       2       2  S02
2             2       1       2       1  S03

让我们计时吧

# create dataframe with 4 million rows
dfbig = pd.concat([df]*1000000, ignore_index=True)
dfbig.shape

# (4000000, 5)
def numpy_broadcasting(data):
    diffs = np.not_equal(data.filter(like='rater'), data['right_answer'][:, None])
    diffs = np.sum(diffs, axis=1) >= 2


def pandas_method(data):
    mask = (
    data.filter(like='rater')
    .ne(df['right_answer'], axis=0).sum(axis=1).ge(2)
    )

%%timeit
numpy_broadcasting(dfbig)
# 92.5 ms ± 789 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

%%timeit
pandas_method(dfbig)
# 296 ms ± 7.27 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

numpy broadcasting快了296 / 92.5 = 3.2

相关问题 更多 >