从 df.groupby("column1")["column2].max() 抽样随机行,如果有多个候选者则不是第一个

Sample random row from df.groupby("column1")["column2].max() and not first one if multiple candidates

从 groupby 中 return n 个随机最大值的正确方法是什么?

我有一个包含音频事件的数据框,包含以下列:

每个标签我有多个 events/rows,我总共有 26 个标签。

我想要实现的是在每个标签上以最大的置信度获得一个事件。

假设我们有 7 个带有标签“救护车”的事件,它们具有以下标签置信度:2、5、5、4、4、3、5。

本例中的最大置信度为 5,这为我们提供了 3 个可选事件。 我想随机抽取三个中的一个。

对 pandas 执行以下操作:df.groupby("label").max() 将 return 第一行最大标记信心。我希望它是一个随机选择。

非常感谢

干杯

安托万

编辑: 根据 OP 的评论,最简单的解决方案是在选择最大行数之前随机播放数据框:

# Some random data
labels = list('ABCDE')
repeats = np.random.randint(1, 6, len(labels))

df = pd.DataFrame({
    'label': np.repeat(labels, repeats),
    'confidence': np.random.randint(1, 6, repeats.sum())
})

# Shuffle the data frame. For each `label` get the first row,
# which we can be sure has the max `confidence` because we
# sorted it
(
    df.sample(frac=1)
      .sort_values(['label', 'confidence'], ascending=[True, False])
      .groupby('label')
      .head(1)
)

如果你在 IPython / Jupyter Notebook 中 运行 这个,请观察结果数据帧的索引以查看结果的随机性。

以下是我最终设法做到的:

shuffled_df = df.sample(frac=1)

filtered_df = shuffled_df.loc[shuffled_df.groupby("label")["confidence"].idxmax()]