Pandas列值反转问题求助:基于条件生成reversed_id列
解决DataFrame中按分组反转Order_id生成reversed_id的问题
嘿,我明白你的需求了——你想针对每个UserA分组,把Order_id的值做一个反向映射,而不是简单反转整个列的顺序对吧?用lambda x::-1没用是因为它只是把分组里的行顺序倒过来,而不是给每个Order_id匹配对应的反向值。
我给你一个精准的解决方案,分步骤来看:
核心思路
- 对每个
UserA分组,先提取唯一的Order_id并排序,得到一个有序的列表(比如你的例子里是[1,2,3,4,5]) - 把这个有序列表反转,得到
[5,4,3,2,1],然后建立一个映射字典:原Order_id → 反转后对应位置的值 - 把这个映射应用到分组里的每一行,就能得到正确的
reversed_id
完整代码示例
import pandas as pd # 构造你提供的DataFrame df = pd.DataFrame({ 'UserA': ['A'] * 8, 'Order_id': [1, 2, 2, 2, 3, 4, 4, 5] }) # 定义处理每个分组的函数 def generate_reversed_ids(group): # 获取当前分组的唯一Order_id并按升序排序 sorted_unique_ids = sorted(group['Order_id'].unique()) # 创建反向映射字典:原id → 反转后的对应id reverse_mapping = { original_id: sorted_unique_ids[::-1][index] for index, original_id in enumerate(sorted_unique_ids) } # 将每个Order_id映射为对应的reversed_id return group['Order_id'].map(reverse_mapping) # 按UserA分组处理,生成reversed_id列 df['reversed_id'] = df.groupby('UserA').apply(generate_reversed_ids).reset_index(drop=True) print(df)
运行这段代码后,你会得到和示例完全一致的结果:
UserA Order_id reversed_id
A 1 5
A 2 4
A 2 4
A 2 4
A 3 3
A 4 2
A 4 2
A 5 1
扩展说明
这个方法还支持多用户的场景,比如如果有UserB的Order_id是[10,20,30],那它的reversed_id会自动变成30,20,10,完全不需要额外修改代码。
内容的提问来源于stack exchange,提问作者mukesh tech01
相关产品推荐
相关产品推荐

