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

如何使用Pandas实现多列透视生成指定四列数据?

实现DataFrame透视生成最小/第二小值及对应分组列

嘿,咱们一步步来搞定这个数据透视的需求!你想要生成那四个新列,虽然pivot是关键工具,但咱们得先做一点预处理——给每个分组里的value排个序,这样才能准确提取最小和第二小的值,以及对应的variable分组。

第一步:构造示例数据(方便你跟着测试)

先搞个示例DataFrame,模拟你的数据结构:

import pandas as pd

df = pd.DataFrame({
    'group': ['A', 'A', 'A', 'B', 'B', 'B'],
    'variable': ['X', 'Y', 'Z', 'X', 'Y', 'Z'],
    'value': [10, 5, 15, 20, 10, 25]
})

第二步:给每个分组内的value添加排名

我们需要按实际分组列(示例中是group)分组,对value做升序排名,这样排名1就是最小的值,排名2就是第二小的值:

# 用method='first'避免相同value时排名重复,保证每行有唯一排名
df['rank'] = df.groupby('group')['value'].rank(method='first', ascending=True).astype(int)

第三步:筛选出排名前2的记录

只保留每个分组里排名1和2的行,也就是我们需要的最小和第二小数据:

top2_df = df[df['rank'].isin([1, 2])]

第四步:用pivot重塑成宽表

先把排名映射成你想要的列前缀,再通过pivot把数据转成目标格式:

# 映射排名到目标列的前缀
rank_mapping = {1: 'Smallest', 2: 'SecondSmallest'}
top2_df['prefix'] = top2_df['rank'].map(rank_mapping)

# 执行透视,index替换成你自己的分组列,columns用前缀,values取value和variable
result = top2_df.pivot(
    index='group',
    columns='prefix',
    values=['value', 'variable']
).reset_index()

# 把多层列名合并成单层,更符合需求
result.columns = ['_'.join(col).strip('_') if col[1] else col[0] for col in result.columns]

# 最后重命名列到你想要的名称
result = result.rename(columns={
    'value_Smallest': 'Smallest',
    'value_SecondSmallest': 'SecondSmallest',
    'variable_Smallest': 'SmallestGroup',
    'variable_SecondSmallest': 'SecondSmallestGroup'
})

最终结果

运行完上面的代码,result就会是你想要的结构:

group  Smallest  SecondSmallest SmallestGroup SecondSmallestGroup
0     A         5              10             Y                   X
1     B        10              20             Y                   X

补充说明

  • 如果你的数据中存在某个分组只有1条记录的情况,第二小的列会显示NaN,可以用result.fillna(...)来填充默认值
  • 示例中的group是假设的分组列,你需要替换成自己数据中实际用来分组的列名

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:29:01