如何在for循环中控制Condition 3固定出现x次,其余随机选1/2
需求与代码修改方案
需求:现有代码会随机从3个条件中选择生成DataFrame的行条件,现在要改成每个分组中Condition 3固定选中x次,剩余次数随机选择Condition 1和2,外层循环次数由num_groups控制。
修改后的完整代码:
import pandas as pd import numpy as np num_rows = 3 num_cols = 4 num_groups = 2 # 新增参数:每个分组中Condition3的固定选中次数 x = 1 # 合法性校验:避免x超出合理范围 if x < 0 or x > num_rows: raise ValueError("x必须是0到num_rows之间的整数") dfs = [] for group in range(num_groups): df = pd.DataFrame() # 修改条件生成逻辑:固定x个Condition3,剩余随机选1/2,再打乱顺序 conditions = [3] * x # 补充剩余行数的条件,仅从1、2中随机选择 conditions += np.random.choice([1, 2], size=num_rows - x).tolist() # 打乱数组顺序,保证条件分布随机 np.random.shuffle(conditions) for condition in conditions: if condition == 1: row_data = ['X'] * (num_cols // 2) + ['-'] * (num_cols // 2) elif condition == 2: row_data = ['-'] * (num_cols // 2) + ['X'] * (num_cols // 2) elif condition == 3: row_data = ['X'] * num_cols temp_df = pd.DataFrame([row_data]) df = pd.concat([df, temp_df], ignore_index=True) dfs.append(df) # 后续输出处理逻辑保持原有逻辑不变 out = pd.concat(dfs, keys=range(len(dfs))) out.index = pd.MultiIndex.from_arrays([out.index.get_level_values(0), range(len(out))]) out = out.stack().unstack([0, -1], fill_value='.') out = out.set_axis(range(out.shape[1]), axis=1) print(out)
关键修改说明:
- 新增参数
x,明确每个分组中Condition3的固定出现次数,同时增加合法性校验避免参数错误 - 重构
conditions数组生成逻辑:- 先创建包含x个3的基础列表
- 用
np.random.choice生成剩余行数的条件,仅从[1,2]中随机选取 - 用
np.random.shuffle打乱整个列表,避免Condition3集中出现在固定位置
- 行生成、DataFrame拼接及后续输出逻辑保持原有逻辑不变
内容的提问来源于stack exchange,提问作者peter_parker
相关产品推荐
相关产品推荐

