带行列名称的Pandas DataFrame相乘报错,求保留结构的乘积结果
解决Pandas DataFrame对应单元格相乘的TypeError问题
你的问题根源很清晰:两个DataFrame里的SKU列是字符串类型,当你直接用*或mul()时,Pandas会尝试对所有列(包括SKU列)执行运算——而字符串和数字(或字符串和字符串)相乘是不被允许的,这就触发了TypeError: can't multiply sequence by non-int of type 'str'。
另外要注意你示例里的细节:两个DataFrame的SKU值大小写不一致(FUJI Film vs FUJI FILM),如果直接对齐会导致匹配失败,处理时需要先统一SKU格式。
下面是两种可行的解决方案:
方案1:将SKU设为索引后计算
把SKU列转为索引,让Pandas只针对数值列运算,同时统一SKU大小写确保对齐:
import pandas as pd # 导入数据 df = pd.read_excel('C:/desktop/Arrays.xlsx', sheet_name=0) df1 = pd.read_excel('C:/desktop/Arrays.xlsx', sheet_name=1) # 将SKU设为索引,并统一大小写避免匹配错误 df = df.set_index('SKU') df.index = df.index.str.upper() df1 = df1.set_index('SKU') df1.index = df1.index.str.upper() # 执行对应单元格相乘 df3 = df.mul(df1) # (可选)将SKU重新转回列 df3 = df3.reset_index()
方案2:仅对数值列计算后合并SKU
如果你不想改动索引,可以单独提取数值列运算,再和SKU列合并:
import pandas as pd df = pd.read_excel('C:/desktop/Arrays.xlsx', sheet_name=0) df1 = pd.read_excel('C:/desktop/Arrays.xlsx', sheet_name=1) # 统一SKU大小写(避免后续数据不一致) df['SKU'] = df['SKU'].str.upper() df1['SKU'] = df1['SKU'].str.upper() # 获取所有数值列(排除SKU) numeric_columns = df.columns.drop('SKU') # 对数值列执行相乘运算 numeric_result = df[numeric_columns].mul(df1[numeric_columns]) # 合并SKU列和运算结果 df3 = pd.concat([df[['SKU']], numeric_result], axis=1)
这两种方法都能保留原有的行列结构,且彻底避免了字符串参与数值运算的问题。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

