如何基于Category列实现两个DataFrame指定列的乘法运算
需求与解决方案
需求说明
我有两个DataFrame:
- 第一个DataFrame的列:
['Srno', 'Category', 'Category%', 'Total', 'X1', 'X2', 'X3', 'X4', 'X5', 'Extra'] - 第二个DataFrame的列:
['Srno', 'Category', 'TotalCount']
需要基于Category列匹配,把第一个DataFrame中的['X1', 'X2', 'X3', 'X4', 'X5', 'Extra']列的值,分别和第二个DataFrame中对应Category的TotalCount值相乘,并用计算结果替换第一个DataFrame中这些列的原始值。
尝试的代码
df.columns = ['Srno', 'Category', 'Category%', 'Total', 'X1', 'X2', 'X3', 'X4', 'X5', 'Extra'] df2.columns = ['Srno', 'Category', 'TotalCount'] for j, k in zip(df2['Totalcount'], df.iloc[:, 4:9]): x = j * k print(x)
问题分析与正确实现
原代码的问题
- 拼写错误:
df2['Totalcount']应该是df2['TotalCount'](大小写不一致) - 列索引错误:
df.iloc[:,4:9]只取到X5,漏掉了Extra列 - 核心逻辑错误:循环没有基于Category匹配,只是简单按位置zip,会导致对应关系混乱
方法一:合并DataFrame后批量计算
先按Category合并两个DataFrame,再对目标列进行乘法操作:
# 按Category合并,保留第一个DF的所有行 merged_df = df.merge(df2[['Category', 'TotalCount']], on='Category', how='left') # 指定需要计算的列 target_cols = ['X1', 'X2', 'X3', 'X4', 'X5', 'Extra'] # 批量相乘替换 df[target_cols] = df[target_cols].mul(merged_df['TotalCount'], axis=0)
方法二:用map匹配对应值(更高效)
不需要合并,直接通过Category映射获取TotalCount,再广播相乘:
# 构建Category到TotalCount的映射字典 count_map = df2.set_index('Category')['TotalCount'].to_dict() # 获取每个行对应的TotalCount值 df['TotalCount'] = df['Category'].map(count_map) # 批量计算替换 target_cols = ['X1', 'X2', 'X3', 'X4', 'X5', 'Extra'] df[target_cols] = df[target_cols] * df['TotalCount'] # 可选:删除临时的TotalCount列 df.drop('TotalCount', axis=1, inplace=True)
内容的提问来源于stack exchange,提问作者Chinmay
相关产品推荐
相关产品推荐

