You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas中按Rank排序生成对应Rank与Prob的新列

解决代码

你要实现的是按ID分组的宽表转换,对应你熟悉的tidyverse里pivot_wider的逻辑,pandas里可以用pivot方法实现,完整可运行代码如下:

  1. 构造测试数据(可跳过,直接替换成你的真实数据即可)
import pandas as pd

df = pd.DataFrame({
    'ID': [123,123,123,123,456,456,456,456],
    'Hour': [10,11,12,13,10,11,12,13],
    'Prob': [0.4,0.6,1.0,0.9,0.8,0.5,0.1,0.2],
    'Rank': [4,3,1,2,1,2,4,3]
})
  1. 执行转换
# 透视转换
res = df.pivot(index='ID', columns='Rank', values=['Hour', 'Prob'])
# 格式化列名
res.columns = [f'{col}_{rank}' if col != 'Hour' else f'Rank_{rank}' for col, rank in res.columns]
# 重置索引,ID恢复为普通列,调整列顺序匹配你的要求
res = res.reset_index()[['ID', 'Rank_1', 'Rank_2', 'Rank_3', 'Rank_4', 'Prob_1', 'Prob_2', 'Prob_3', 'Prob_4']]

执行后输出的res就和你预期的结果完全一致。

与tidyverse逻辑对应

上面的代码等价于你熟悉的R tidyverse写法:

library(tidyverse)
df %>%
  pivot_wider(
    id_cols = ID,
    names_from = Rank,
    values_from = c(Hour, Prob),
    names_glue = "{ifelse(.value=='Hour','Rank',.value)}_{Rank}"
  ) %>%
  select(ID, starts_with("Rank"), starts_with("Prob"))

核心逻辑都是按ID聚合,把Rank值作为新列的后缀,分别提取Hour和Prob作为新列的值。

内容的提问来源于stack exchange,提问作者Raju

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.16 14:54:03