如何使用数值数组批量更新Pandas DataFrame的指定列?
问题:将数值数组更新到Pandas DataFrame中
需求说明
我有一个Pandas DataFrame和一个数值数组,想要把数组的数据更新到DataFrame中,具体示例如下:
输入
DataFrame:
Time | 1 | 2 | 3 | 4 | 5 | prod1| 0 | 0 | 0 | 0 | 0 | prod2| 0 | 0 | 0 | 0 | 0 | prod3| 0 | 0 | 0 | 0 | 0 |
数组:
productList = [3,4,5]
输出
Time | 1 | 2 | 3 | 4 | 5 | prod1| 0 | 0 | 3 | 3 | 3 | prod2| 0 | 0 | 4 | 4 | 4 | prod3| 0 | 0 | 5 | 5 | 5 |
我的尝试代码
import pandas as pd import numpy Product_matrix = pd.DataFrame(index=['Prod1','Prod2','Prod3','Prod4','Prod5'], columns=[x for x in range(1,30)]) Product_matrix[:] = 0 a = Product_matrix b = numpy.transpose([6,5,7,0,0]) a.iloc[:,3:6] = [x + b for x in a.iloc[:,3:6]] print(a)
解决方案
核心思路
利用Pandas的广播机制,将一维数组转换为匹配DataFrame行维度的二维列向量,直接赋值到目标列区间,避免错误的循环操作。
针对示例需求的实现代码
import pandas as pd import numpy as np # 初始化示例DataFrame df = pd.DataFrame( [[0,0,0,0,0], [0,0,0,0,0], [0,0,0,0,0]], index=['prod1', 'prod2', 'prod3'], columns=[1,2,3,4,5] ) productList = [3,4,5] # 方法1:手动构造每行重复的列表 df.iloc[:, 2:] = [[val]*3 for val in productList] # 方法2:利用numpy重塑数组实现广播(更简洁) # df.iloc[:, 2:] = np.array(productList).reshape(-1, 1) print(df)
修复你的尝试代码
你的代码问题在于循环迭代的是DataFrame的列,导致维度不匹配。修改后如下:
import pandas as pd import numpy as np Product_matrix = pd.DataFrame(index=['Prod1','Prod2','Prod3','Prod4','Prod5'], columns=[x for x in range(1,30)]) Product_matrix[:] = 0 # 将数组转为二维列向量,匹配行维度 b = np.array([6,5,7,0,0]).reshape(-1, 1) # 赋值到第4至第6列(iloc[:,3:6]对应列索引3、4、5) Product_matrix.iloc[:,3:6] = b print(Product_matrix)
内容的提问来源于stack exchange,提问作者Kang H.
相关产品推荐
相关产品推荐

