
本文介绍如何使用numpy和pandas高效地为dataframe中多个命名规律的列(如fan1_rpm、fan2_rpm等)一次性初始化相同范围的随机整数,避免重复赋值,大幅提升代码简洁性与可维护性。
本文介绍如何使用numpy和pandas高效地为dataframe中多个命名规律的列(如fan1_rpm、fan2_rpm等)一次性初始化相同范围的随机整数,避免重复赋值,大幅提升代码简洁性与可维护性。
在数据预处理或模拟测试场景中,常需为多个结构相似的列批量填充随机整数(例如风扇转速、传感器读数等)。若手动逐列赋值(如 df['fan1_rpm'] = np.random.randint(...)),不仅冗长易错,且难以扩展。Pythonic 的解决方案是向量化生成 + 批量赋值,充分利用 NumPy 的广播能力和 Pandas 的列索引机制。
✅ 推荐写法(一行核心操作)
import numpy as np
import pandas as pd
# 假设 df 已存在(例如:df = pd.DataFrame(index=range(30)))
n_cols = 14
cols = [f"fan{i}_rpm" for i in range(1, n_cols + 1)]
# 一行完成:生成 (30, 14) 随机整数矩阵,并批量赋给指定列
df[cols] = np.random.randint(5675, 5725, size=(len(df), n_cols))
? 关键原理:
np.random.randint(low, high, size=(rows, cols))返回二维数组;Pandas 允许直接用列名列表df[cols]接收该数组,自动按列对齐——前提是列数匹配且df行数一致。
⚠️ 注意事项
-
行数必须一致:
size中的行数(如len(df))应严格等于df的实际行数,否则会报错ValueError: Shape of passed values is ...; -
列名需预先存在或允许新增:若
cols中某些列尚不存在,Pandas 会自动创建;若仅想更新已有列,请先确保列已定义(如df = df.reindex(columns=df.columns.union(cols))); -
范围理解:
np.random.randint(5675, 5725)生成的是[5675, 5725)区间内的整数(即含5675,不含5725); -
可复现性:如需结果可重现,务必设置随机种子:
np.random.seed(42)(放在生成前)。
? 扩展技巧
若列名模式更复杂(如 fan_01_rpm, fan_02_rpm 或混合前缀),可灵活构造 cols 列表:
# 零填充编号
cols = [f"fan_{i:02d}_rpm" for i in range(1, 15)]
# 多组不同范围?用字典驱动
config = {"fan_rpm": (5675, 5725), "temp_c": (20, 35), "voltage_v": (11.8, 12.2)}
for col_prefix, (low, high) in config.items():
n = 14 if col_prefix == "fan_rpm" else 4 # 每组列数可不同
sub_cols = [f"{col_prefix}_{i}" for i in range(1, n+1)]
df[sub_cols] = np.random.randint(low, high, size=(len(df), n))
通过这一方法,14列的初始化从14行重复代码压缩为3行核心逻辑,清晰、高效、易维护——这正是 Python 数据科学工作流所推崇的“向量化思维”。










