如何构造行列双轴数值均匀分布的Pandas DataFrame?
双轴均匀数值填充实现方案
核心前提
要同时满足行、列两个方向的数值计数均匀,参数必须先符合数学约束:
- 列数
cols必须能被n整除,保证每行每个值出现次数为cols/n(整数) - 行数
rows必须能被n整除,保证每列每个值出现次数为rows/n(整数)
你给出的示例参数cols=8, rows=4, n=4刚好满足上述约束,可实现严格双轴均匀。
实现逻辑
不需要用排列组合随机拼接,直接用循环移位规则生成矩阵即可:任意位置(i,j)(第i行、第j列)的取值为(i + j) % n,天然满足:
- 同一行内每向右一列,值+1后对n取模,每n列完成一次循环
- 同一列内每向下一行,值+1后对n取模,每n行完成一次循环
两个方向都能保证所有值出现次数完全相等。
可直接运行的代码
import numpy as np import pandas as pd def create_uniform_df(cols: int, rows: int, n: int) -> pd.DataFrame: # 参数合法性校验 if cols % n != 0 or rows % n != 0: raise ValueError("cols和rows必须均可被n整除,否则不存在严格双轴均匀的填充结果") # 生成行列索引网格 row_grid, col_grid = np.indices((rows, cols)) # 核心计算:循环移位生成矩阵 mat = (row_grid + col_grid) % n # 组装为带指定索引的DataFrame df = pd.DataFrame( mat, index=[f"row_{i}" for i in range(rows)], columns=[f"col{i}" for i in range(cols)] ) return df
效果验证
用你给出的参数测试:
params = {'cols': 8, 'rows': 4, 'n': 4} df = create_uniform_df(**params) print(df)
输出与期望结果完全一致:
col0 col1 col2 col3 col4 col5 col6 col7 row_0 0 1 2 3 0 1 2 3 row_1 1 2 3 0 1 2 3 0 row_2 2 3 0 1 2 3 0 1 row_3 3 0 1 2 3 0 1 2
行方向计数校验:
print(df.apply(lambda x: x.value_counts(), axis=1))
0 1 2 3 row_0 2 2 2 2 row_1 2 2 2 2 row_2 2 2 2 2 row_3 2 2 2 2
列方向计数校验:
print(df.apply(lambda x: x.value_counts()))
col0 col1 col2 col3 col4 col5 col6 col7 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1
扩展说明
- 你之前的实现问题在于:随机排列拼接时没有做行与行之间的固定偏移对齐,导致同列内部分值重复、部分值缺失,才会出现计数NaN的问题
- 如果需要打乱数值顺序避免规律过于明显,只需要先生成0~n-1的随机排列作为映射表,替换矩阵中的对应值即可,双轴均匀的特性不会被破坏
内容的提问来源于stack exchange,提问作者BeRT2me
相关产品推荐
相关产品推荐

