如何对Pandas多层索引DataFrame的内外层索引分别独立随机打乱
多层索引内外层独立打乱解决方案
实现思路
- 先提取所有外层索引的唯一值,完成外层索引顺序的随机打乱
- 遍历打乱后的外层索引,逐个取出对应分组,对每个分组单独做行随机打乱(即实现内层索引独立打乱)
- 按打乱后的外层顺序拼接所有处理后的分组,得到最终结果
完整代码示例
首先是示例DataFrame生成代码:
import pandas as pd import numpy as np fruits=pd.DataFrame() fruits['month']=['jan','feb','feb','march','jan','april','april','june','march','march','june','april'] fruits['fruit']=['apple','orange','pear','orange','apple','pear','cherry','pear','orange','cherry','apple','cherry'] ind=fruits.index ind_mnth=fruits['month'].values fruits['price']=[30,20,40,25,30 ,45,60,45,25,55,37,60] fruits_grp = fruits.set_index([ind_mnth, ind],drop=False)
核心实现代码:
# 1. 打乱外层索引顺序 unique_outer_index = fruits_grp.index.get_level_values(0).unique() shuffled_outer_index = np.random.permutation(unique_outer_index) processed_groups = [] for outer_val in shuffled_outer_index: # 取出当前外层索引对应的所有行,保留原多层索引结构 current_group = fruits_grp.xs(outer_val, level=0, drop_level=False) # 对当前分组内部行做随机打乱(内层索引独立打乱) # 如需固定随机结果可添加参数 random_state=任意整数 shuffled_group = current_group.sample(frac=1) processed_groups.append(shuffled_group) # 拼接所有分组得到最终DataFrame result_df = pd.concat(processed_groups)
效果验证
你可以输出result_df.index查看索引结构:外层索引的顺序是随机打乱的,同一个外层索引下的内层索引顺序也是随机的,不同外层的内层打乱逻辑互相独立,不会互相影响。
内容的提问来源于stack exchange,提问作者Medha Chippa
相关产品推荐
相关产品推荐

