Pandas插入Milk Price列异常:逐行相乘结果重复问题求助
问题:实现Pandas逐行计算牛奶价格列
需求:在rdf中插入Milk Price列,该列值为每行的Milk字段与pdf中的Price字段相乘的结果,但当前代码运行后所有行的Milk Price值均为同一个数值,仅计算了单个行的结果。
原代码
import pandas as pd import numpy as np from sklearn import svm from sklearn import preprocessing import matplotlib.pyplot as plt recpies = pd.read_csv('recipes_muffins_cupcakes.csv') prices = pd.read_csv('recipes_price.csv') rdf = pd.DataFrame(recpies) pdf = pd.DataFrame(prices) #recpies ['Milk_Price'] = rdf.iloc[:,-1]*pdf.loc[1]['Price'] mo = str(len(recpies)) res="" for i in mo: res = rdf.loc[int(i)]['Milk'] * pdf.loc[1]['Price'] rdf.insert(3,"Milk Price",res,allow_duplicates=True) print(rdf) print(pdf)
当前输出
Type Flour Milk Milk Price ... Egg Baking Powder Vanilla Salt 0 Muffin 0.55 0.28 5.04 ... 5 0.002 0.000 0 1 Muffin 0.47 0.24 5.04 ... 9 0.001 0.000 0 2 Muffin 0.47 0.23 5.04 ... 4 0.001 0.000 0 3 Muffin 0.45 0.11 5.04 ... 8 0.001 0.000 0 4 Muffin 0.50 0.25 5.04 ... 5 0.002 0.001 0 5 Muffin 0.55 0.27 5.04 ... 5 0.002 0.001 0 6 Muffin 0.54 0.27 5.04 ... 5 0.002 0.000 0 7 Muffin 0.47 0.26 5.04 ... 4 0.001 0.000 0 8 Muffin 0.50 0.17 5.04 ... 6 0.001 0.000 0 9 Muffin 0.50 0.17 5.04 ... 4 0.001 0.000 0 10 Cupcake 0.39 0.00 5.04 ... 14 0.001 0.001 0 11 Cupcake 0.42 0.21 5.04 ... 8 0.003 0.000 0 12 Cupcake 0.34 0.17 5.04 ... 5 0.002 0.001 0 13 Cupcake 0.39 0.13 5.04 ... 10 0.001 0.001 0 14 Cupcake 0.38 0.15 5.04 ... 8 0.000 0.001 0 15 Cupcake 0.42 0.18 5.04 ... 5 0.001 0.000 0 16 Cupcake 0.36 0.14 5.04 ... 11 0.002 0.001 0 17 Cupcake 0.38 0.15 5.04 ... 6 0.001 0.001 0 18 Cupcake 0.36 0.16 5.04 ... 9 0.001 0.001 0 19 Cupcake 0.34 0.17 5.04 ... 13 0.000 0.000 0 [20 rows x 10 columns]
问题原因
原代码的循环逻辑完全错误:
mo = str(len(recpies))把数据行数(比如20)转成字符串"20",循环时i取的是字符"2"和"0",仅计算了索引为2和0的行,最后res只保留了最后一次循环的结果(索引0的行计算值)。- 最后插入列时把单个值
res广播到所有行,导致所有行的Milk Price值相同。
修正方案
Pandas支持矢量化运算,不需要手动循环逐行计算,直接对整列进行运算即可,代码更简洁高效:
import pandas as pd import numpy as np from sklearn import svm from sklearn import preprocessing import matplotlib.pyplot as plt # 读取数据 recpies = pd.read_csv('recipes_muffins_cupcakes.csv') prices = pd.read_csv('recipes_price.csv') rdf = pd.DataFrame(recpies) pdf = pd.DataFrame(prices) # 获取牛奶单价(假设pdf中第2行索引为1的Price是牛奶单价) milk_price = pdf.loc[1]['Price'] # 直接计算整列的Milk Price,自动逐行运算 rdf.insert(3, "Milk Price", rdf['Milk'] * milk_price, allow_duplicates=True) print(rdf) print(pdf)
说明
rdf['Milk']是Series类型,与单个数值milk_price相乘时,Pandas会自动对Series中的每一个元素执行乘法运算,生成新的Series作为Milk Price列的值。- 这种方式比手动循环效率高得多,尤其在数据量较大时优势明显。
内容的提问来源于stack exchange,提问作者Mohammad Mahdi Yazdani
相关产品推荐
相关产品推荐

