【问题标题】:Pandas collapse multiple rows into one by selecting the most probable熊猫通过选择最可能的将多行合并为一行
【发布时间】:2022-01-11 14:26:22
【问题描述】:

问题

我的第一个 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的索引?
  • @QuangHoang 是的

标签: python pandas dataframe pandas-groupby


【解决方案1】:

您希望使用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

【讨论】:

    猜你喜欢
    • 2022-12-06
    • 1970-01-01
    • 1970-01-01
    • 2014-04-26
    • 1970-01-01
    • 2020-10-26
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多