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

如何在Pandas DataFrame中实现Top3数据的宽格式转换

Pandas实现长格式转宽格式(提取每个code的Top3属性)

没问题!我来教你怎么用Pandas实现这个长转宽的需求,完全不需要依赖透视表,步骤清晰又好理解:

第一步:先构造示例数据(你可以直接替换成自己的DataFrame)

import pandas as pd

# 你的原始数据
data = {
    'code': [394, 394, 394, 418, 418, 418, 539, 539, 539, 555, 555, 555],
    'attribute': ['Feminine', 'Fresh', 'Heavy', 'Soft', 'Fresh', 'Clean', 'Fresh', 'Soft', 'Feminine', 'Feminine', 'Heavy', 'Soft'],
    'rank_count': [9, 9, 8, 13, 12, 11, 14, 14, 11, 9, 8, 7]
}
df = pd.DataFrame(data)

第二步:核心处理逻辑

我们需要先按code分组排序,再生成带排名的属性字符串,最后重塑成宽格式:

# 1. 按code分组,每个组内按rank_count降序排序(同分值按属性名升序,和示例一致)
df_sorted = df.groupby('code', group_keys=False).apply(
    lambda x: x.sort_values(by=['rank_count', 'attribute'], ascending=[False, True])
)

# 2. 拼接成「属性(排名值)」的格式
df_sorted['attr_with_rank'] = df_sorted['attribute'] + ' (' + df_sorted['rank_count'].astype(str) + ')'

# 3. 给每个组内的行分配top1/top2/top3标识,转成宽格式
result = df_sorted.groupby('code').apply(
    lambda x: x.reset_index(drop=True).assign(top_col=[f'top{i+1}' for i in x.index])
).pivot(index='code', columns='top_col', values='attr_with_rank')

# 确保只保留top1-top3列(避免组内属性过多时生成多余列)
result = result[['top1', 'top2', 'top3']]

第三步:查看结果

运行后输出的result就是你想要的宽格式:

top1           top2            top3
code                                              
394   Feminine (9)     Fresh (9)      Heavy (8)
418       Soft (13)    Fresh (12)     Clean (11)
539       Fresh (14)    Soft (14)  Feminine (11)
555   Feminine (9)     Heavy (8)       Soft (7)

可选优化:处理不足3个属性的情况

如果有的code对应的属性数量少于3个,结果中会出现NaN,你可以用这行代码把空值替换成空字符串:

result = result.fillna('')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:51:43