Pandas 通过选择最可能的将多行合并为一

Pandas collapse multiple rows into one by selecting the most probable

问题

我的第一个 DataFrame 包含以下内容:

df1 = pd.DataFrame(
    [[1, 'C_A'], [2, 'C_B'], [3, 'C_C'], [3, 'C_D'], [4, 'C_F']],
    columns=['time', 'category']
)

   time category
0     1      C_A
1     2      C_B
2     3      C_C
3     3      C_D
4     4      C_F

一些行具有多个时间条目

现在我的第二个 df 是概率分布在每个时间每个类别:

df2 = pd.DataFrame(
    [[1., 0., 0., 0., 0.], [0., 1., 0., 0., 0.],
     [0., 0., 0.7, 0.3, 0.], [1, 0., 0., 0., 0.]],
    columns=['C_A', 'C_B', 'C_C', 'C_D', 'C_F']
)

   C_A  C_B  C_C  C_D  C_F
0  1.0  0.0  0.0  0.0  0.0
1  0.0  1.0  0.0  0.0  0.0
2  0.0  0.0  0.7  0.3  0.0
3  1.0  0.0  0.0  0.0  0.0

对于只有一次的行,我想保持原样

但是,例如,对于 df13rd4th 行,我只想保留 1多行中的 最高概率.

最终结果为:

pd.DataFrame(
    [[1, 'C_A'], [2, 'C_B'], [3, 'C_C'], [4, 'C_F']],
    columns=['time', 'category']
)

   time category
0     1      C_A
1     2      C_B
2     3      C_C
3     4      C_F

问题

当这些多行出现时,我如何折叠这些行,并根据我的其他 DataFrame 保留概率最大的行?

您想使用 df1.time 作为索引并使用 df2.category 作为列从 df2 中提取值(概率)。然后,您可以对值进行排序并删除重复项。

第一步基本上是已弃用的 lookup 函数的情况。您可以改用 numpy 索引:

row_idx, col_idx = df2.index.get_indexer(df1.time-1), df2.columns.get_indexer(df1.category)

(df1.assign(prob=df2.to_numpy()[row_idx, col_idx])
    .sort_values(['time', 'prob'])
    .drop_duplicates('time', keep='last')
)

输出:

   time category  prob
0     1      C_A   1.0
1     2      C_B   1.0
2     3      C_C   0.7
4     4      C_F   0.0