You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于匹配的索引/行名对Pandas DataFrame列进行相乘?

Pandas按匹配列批量相乘的简洁实现

针对你遇到的问题,核心是让df1中除hash外的所有列,根据hash匹配df2的v值进行相乘,未匹配的行保持原样。这里提供两种简洁的实现方式:

方法一:字典映射法(直观易懂)

先将df2的hash和v转为字典,再映射到df1的每行,最后批量相乘:

import pandas as pd

# 构造示例数据
df1 = pd.DataFrame({
    'hash': ['ABC', 'def', 'Xyz'],
    'a': [1, 5, 3],
    'b': [2, 3, 2],
    'c': [3, 4, -1]
})

df2 = pd.DataFrame({
    'hash': ['Xyz', 'def'],
    'v': [3, 5]
})

# 生成hash到v的映射字典
v_mapping = df2.set_index('hash')['v'].to_dict()
# 为df1添加乘数列,未匹配的行用1填充(乘1不改变原值)
df1['multiplier'] = df1['hash'].map(v_mapping).fillna(1)
# 对数值列批量相乘,然后移除乘数列
result = df1.assign(
    a=df1['a'] * df1['multiplier'],
    b=df1['b'] * df1['multiplier'],
    c=df1['c'] * df1['multiplier']
).drop('multiplier', axis=1)

print(result)

方法二:索引对齐法(更Pythonic)

利用Pandas的索引对齐特性,通过reindex保证两个DataFrame的索引一致,缺失值填充为1后直接相乘:

import pandas as pd

# 构造示例数据(同上)
df1 = pd.DataFrame({
    'hash': ['ABC', 'def', 'Xyz'],
    'a': [1, 5, 3],
    'b': [2, 3, 2],
    'c': [3, 4, -1]
})

df2 = pd.DataFrame({
    'hash': ['Xyz', 'def'],
    'v': [3, 5]
})

# 将hash设为索引
df1_idx = df1.set_index('hash')
df2_idx = df2.set_index('hash')
# 重新索引df2的v列,对齐df1的索引,缺失值填1,然后逐行相乘
result = df1_idx.mul(df2_idx['v'].reindex(df1_idx.index, fill_value=1), axis=0).reset_index()

print(result)

两种方法都会输出你需要的结果:

hash   a   b   c
0  ABC   1   2   3
1  def  25  15  20
2  Xyz   9   6  -3

注:你之前尝试的mul方法失败,是因为df2的索引仅包含部分hash值,相乘后未匹配的行会变成NaN,而通过reindex填充1就能解决这个问题。

内容的提问来源于stack exchange,提问作者klados

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 22:06:33