如何为Pandas DataFrame每行生成50个随机数并与指定列相乘生成新列?
最优实现方式
直接利用Numpy的广播机制做向量化运算,比apply效率高得多,尤其当数据量较大时:
import pandas as pd import numpy as np colnum = 50 b = [f"t{x}" for x in range(colnum)] # 新列名 df = pd.DataFrame([[i] for i in range(10)], columns=['num']) # 示例DataFrame # 生成行数与df一致、列数为colnum的随机数矩阵 random_matrix = np.random.lognormal(0, 1, size=(len(df), colnum)) # 利用广播将原列与随机矩阵相乘,直接赋值给新列 df[b] = df['num'].to_numpy()[:, np.newaxis] * random_matrix
原代码问题分析
你用apply返回的是一个元素为列表的Series,Pandas无法自动将这些列表拆分成多列。而向量化方式直接生成二维数组,和目标列结构完全匹配,能直接对应到50个新列上。
补充说明
- 用
to_numpy()[:, np.newaxis]把原列的一维数组转换成二维列向量,这样和random_matrix(二维矩阵)相乘时会触发广播机制,每行的数值都会和该行的50个随机数逐一相乘。 - 这种方法完全避免了逐行循环,运算效率远高于
apply,适合处理大规模数据。
内容的提问来源于stack exchange,提问作者Alex Zabeo
相关产品推荐
相关产品推荐

