如何使用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
相关产品推荐
相关产品推荐

