pandas中基于另一列类别对单列子集执行组内置换的实现方法
分组内列值随机置换的pandas实现
你可以直接用pandas内置的groupby+transform组合实现需求,完全不需要显式循环,对上千个分组的场景性能足够:
核心实现代码
import pandas as pd # 示例DataFrame构造 df = pd.DataFrame({ 'col1': [1, 1, 1, 2, 2, 2, 3, 3, 3], 'col2': ['a', 'b', 'c', 'A', 'C', 'B', 'red', 'blue', 'green'] }) # 仅在col1同组范围内打乱col2 df['col2'] = df.groupby('col1')['col2'].transform(lambda x: x.sample(frac=1).values)
说明
sample(frac=1)代表对当前组的样本100%随机抽取,等价于打乱顺序- 末尾加
.values是为了返回numpy数组,规避pandas索引对齐导致打乱失效的问题 - 如果需要固定随机结果方便复现,可以给
sample加random_state参数,例如x.sample(frac=1, random_state=42).values
方案优势
- 没有显式循环,代码简洁易读
- 基于pandas原生优化的分组逻辑,即使col1有数千个不同分组,执行效率也远高于手写循环
内容的提问来源于stack exchange,提问作者user7725010
相关产品推荐
相关产品推荐

