如何在Pandas中按Rank排序生成对应Rank与Prob的新列
解决代码
你要实现的是按ID分组的宽表转换,对应你熟悉的tidyverse里pivot_wider的逻辑,pandas里可以用pivot方法实现,完整可运行代码如下:
- 构造测试数据(可跳过,直接替换成你的真实数据即可)
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] })
- 执行转换
# 透视转换 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
相关产品推荐
相关产品推荐

