如何在Pandas DataFrame中新增Sum列计算每行订购数量乘单品价格
错误原因
- 报错
ValueError: invalid literal for int() with base 10: '11.95'的核心原因是Price Each列的内容是带小数点的字符串,无法直接转换为整数类型。 astype()方法不属于inplace操作,仅执行df['Price Each'].astype('int')不会修改原DataFrame的列类型,必须赋值回对应列才会生效。- 原有
df.assign('Sum'== df['Quantity Ordered'] * df['Price Each'])写法错误:==是比较运算符,无法完成赋值操作,且assign方法执行后会返回新的DataFrame,不赋值给原变量的话修改不会生效。
修复方案
两种可选实现方式,根据你对Sum列的数值类型需求选择:
方式1:保留小数(更符合价格计算逻辑,推荐)
不需要强制转int,直接用原始值计算即可:
import pandas as pd from pathlib import Path # 读取文件逻辑不变 files = Path("").rglob("*.csv") df_list = [pd.read_csv(file, index_col=0) for file in files] df = pd.concat(df_list) df.reset_index(drop=True, inplace=True) df.dropna(subset = ["Order ID"], inplace=True) # 先转成数值类型,异常值自动转为空值避免报错 df['Price Each'] = pd.to_numeric(df['Price Each'], errors='coerce') df['Quantity Ordered'] = pd.to_numeric(df['Quantity Ordered'], errors='coerce') # 直接计算Sum列并赋值 df['Sum'] = df['Quantity Ordered'] * df['Price Each'] print(df)
如果你偏好使用
assign方法实现新增列,正确写法如下,注意必须将返回结果赋值给原变量:df = df.assign(Sum = lambda x: x['Quantity Ordered'] * x['Price Each'])
方式2:Sum列需要为整数
如果业务要求必须取整,可以先转浮点再转整数,或者先四舍五入:
# 转成浮点后转int,会直接截断小数部分 df['Price Each'] = df['Price Each'].astype(float).astype(int) df['Quantity Ordered'] = df['Quantity Ordered'].astype(int) df['Sum'] = df['Quantity Ordered'] * df['Price Each'] # 如果需要四舍五入取整,替换为以下写法 # df['Sum'] = (df['Quantity Ordered'] * df['Price Each']).round(0).astype(int)
内容的提问来源于stack exchange,提问作者ShopEySwing
相关产品推荐
相关产品推荐

