如何实现DataFrame行与numpy数组的相乘操作?
如何将Pandas DataFrame的行与NumPy数组相乘
先把你的示例DataFrame用代码复现出来,方便咱们一步步演示:
import pandas as pd import numpy as np data = { 'Date': ['2018-03-28', '2018-03-29', '2018-04-02', '2018-04-03', '2018-04-04', '2018-04-05', '2018-04-06', '2018-03-23', '2018-03-26', '2018-03-27', '2018-03-28', '2018-03-29', '2018-04-02', '2018-04-03', '2018-04-04', '2018-04-05'], 'Last': [64.67, 64.91, 62.85, 63.57, 63.56, 63.73, 61.93, 65.74, 65.49, 64.67, 64.67, 64.91, 62.85, 63.57, 63.56, 63.73], 'portfolioID': [1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3], 'FinancialInstrument': ['Oil']*16 } df = pd.DataFrame(data)
接下来分两种最常见的场景来处理,你可以根据自己的需求选择:
场景1:给指定数值列批量乘对应系数
你的DataFrame里,Last和portfolioID是数值型列,Date、FinancialInstrument这类字符串/日期列没法参与乘法。假设你有一个长度和数值列数量一致的NumPy数组,想让每一行的数值元素和数组对应位置相乘:
先定义乘数数组:
# 第一个元素对应Last列的乘数,第二个对应portfolioID列 multiplier = np.array([0.5, 2])
然后筛选出数值列做运算,再把结果合并回原DataFrame:
# 筛选所有数值类型的列 numeric_cols = df.select_dtypes(include=np.number) # 逐元素相乘 result_numeric = numeric_cols * multiplier # 把结果替换回原DataFrame(保留非数值列) df_updated = df.copy() df_updated[numeric_cols.columns] = result_numeric
这样处理后,Last列的值会变成原来的0.5倍,portfolioID会翻倍,非数值列完全不变。
场景2:给每行的特定列乘独特系数
如果你的需求是给每一行的某个数值列(比如Last)分配一个专属的乘数,也就是用一个长度和DataFrame行数一致的数组来逐行相乘:
示例代码如下:
# 生成一个和行数相同的数组(这里用随机数,你换成自己的数组就行) row_multipliers = np.random.rand(len(df)) # 给Last列逐行相乘,新增一列存储结果 df['Last_multiplied'] = df['Last'] * row_multipliers
执行后会新增Last_multiplied列,每一行的值都是对应Last值和数组元素的乘积。
几个要注意的点
- 一定要保证数组的长度和目标列/行的长度匹配,不然会抛出维度不匹配的错误;
- 非数值列别拿去乘,先筛选出数值列再操作,避免报错;
- 如果不想修改原始数据,记得先拷贝一份再操作(比如用
df.copy()),防止误改原数据。
内容的提问来源于stack exchange,提问作者pa0011
相关产品推荐
相关产品推荐

