如何用循环批量生成含随机0和1的二进制DataFrame集合?
批量生成每列仅含一个1的0-1 DataFrame解决方案
原循环代码的问题
- 没必要用双层循环:
bins和binsx是一一对应的,双层循环会让每个变量被重复赋值4次,完全冗余 - 错误覆盖数据:刚生成的随机数组被
pd.DataFrame()直接覆盖成空表,后续操作根本没用到随机数据 - 逻辑完全错了:
[eachBin]==[eachBin].max()是在对字符串列表做比较,不是对生成的随机DataFrame操作,根本达不到目标
修正后的可运行代码
保持和单个生成一致的逻辑,用zip配对两个列表批量处理:
import numpy as np import pandas as pd bins = ['bin1_df', 'bin2_df', 'bin3_df', 'bin4_df'] binsx = ['binx1_df', 'binx2_df', 'binx3_df', 'binx4_df'] for bin_name, binx_name in zip(bins, binsx): # 生成随机数组并转为DataFrame,和单个生成逻辑一致 rand_df = pd.DataFrame(np.random.rand(4,4)) # 保存原始随机DataFrame到指定变量名 vars()[bin_name] = rand_df # 按列标记最大值位置为1,其余为0 vars()[binx_name] = (rand_df == rand_df.max()).astype(int)
更可靠的备选方案(避免极端多最大值情况)
如果担心某列出现多个相同最大值导致多1的情况,可直接随机选每列的1的位置:
import numpy as np import pandas as pd bins = ['bin1_df', 'bin2_df', 'bin3_df', 'bin4_df'] binsx = ['binx1_df', 'binx2_df', 'binx3_df', 'binx4_df'] for bin_name, binx_name in zip(bins, binsx): # 每列随机选一个行索引作为1的位置 ones_positions = np.random.choice(4, size=4) # 初始化全0矩阵 result_df = pd.DataFrame(np.zeros((4,4), dtype=int)) # 给对应位置赋值1 for col_idx, row_idx in enumerate(ones_positions): result_df.iloc[row_idx, col_idx] = 1 # 保存结果 vars()[binx_name] = result_df # 如需保留原始随机数组,可添加rand_df的生成和保存逻辑
内容的提问来源于stack exchange,提问作者user23317935
相关产品推荐
相关产品推荐

