Python中如何让DataFrame整列与标量正确执行数值乘法运算

问题复现代码
df = pd.DataFrame(pd.read_csv("SPOILER_Monster_Hunt.csv")) df.columns = ["S/No", "Member_Name", "L1", "L2", "L3", "L4", "L5"] #some modifications below df = df.drop(index=0) df = df.drop(columns='S/No') df = df.fillna(0) #Adjusting points with monster levels df['L1'] = df['L1'] * 50 df['L2'] = df['L2'] * 150 df['L3'] = df['L3'] * 300 df['L4'] = df['L4'] * 1000 df['L5'] = df['L5'] * 2000 df.head() # show the dataframe print(df)
异常表现:执行列与标量的乘法操作时,列内值会被重复对应次数,例如运行
df['L1'] = df['L1']*50时,L1列内容被重复50次,无法实现单元格数值与标量做算术乘法的预期效果。
问题原因
异常本质是类型不匹配:read_csv读入数据时,L1-L5列被识别为字符串(object)类型,而非数值类型。Python原生逻辑中,字符串乘整数的效果是将字符串重复对应次数,和数值乘法逻辑完全不同,因此触发异常。
执行print(df.dtypes)即可验证,输出中L1-L5列的类型会显示为object,而非int64/float64。
修复方案
任选一种方案即可解决:
- 方案1(兼容性最好,推荐):完成基础数据清洗后,手动将参与计算的列转换为数值类型,再执行乘法计算,修正后完整代码如下:
import pandas as pd df = pd.read_csv("SPOILER_Monster_Hunt.csv") df.columns = ["S/No", "Member_Name", "L1", "L2", "L3", "L4", "L5"] df = df.drop(index=0) df = df.drop(columns='S/No') df = df.fillna(0) # 新增:将等级列统一转换为整数类型 level_columns = ["L1", "L2", "L3", "L4", "L5"] df[level_columns] = df[level_columns].astype(int) # 后续积分计算逻辑可正常执行算术乘法 df['L1'] = df['L1'] * 50 df['L2'] = df['L2'] * 150 df['L3'] = df['L3'] * 300 df['L4'] = df['L4'] * 1000 df['L5'] = df['L5'] * 2000 print(df.head()) print(df)
- 方案2:读入数据时直接跳过第一行脏数据(当前代码中
drop(index=0)就是删除这行异常数据),让pandas自动识别列类型,无需手动转换:
import pandas as pd # 读入时跳过第1行脏数据,自动识别数值列类型 df = pd.read_csv("SPOILER_Monster_Hunt.csv", skiprows=1) df.columns = ["S/No", "Member_Name", "L1", "L2", "L3", "L4", "L5"] df = df.drop(columns='S/No') df = df.fillna(0) # 后续乘法逻辑可直接正常运行 df['L1'] = df['L1'] * 50 df['L2'] = df['L2'] * 150 df['L3'] = df['L3'] * 300 df['L4'] = df['L4'] * 1000 df['L5'] = df['L5'] * 2000 print(df.head())
内容的提问来源于stack exchange,提问作者Junaid Ahmed
相关产品推荐
相关产品推荐

