如何基于匹配的索引/行名对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
相关产品推荐
相关产品推荐

