不同尺寸DataFrame匹配首列名称后对应列相乘的实现方法及报错解决
解决DataFrame按name匹配列值相乘的问题
别担心,刚接触Pandas DataFrame遇到这种问题太正常啦!你之前碰到的ValueError,是因为直接用df1['name'] == df2['name']的时候,Pandas是按索引位置去逐行比较的,而不是按name的实际值去匹配对应的行——毕竟两个DataFrame长度不一样,没法按索引对齐,自然就报错啦。
下面给你两种简单有效的实现方法,都能得到你想要的df3:
方法一:用merge合并后计算
先把两个DataFrame按name列合并,把df1的对应列和df2的列关联起来,再做乘法:
import pandas as pd # 先还原你的两个DataFrame df1 = pd.DataFrame({ 'name': ['0001', '0002', '0003', '0004'], 'var1': [1.08, 2.11, 1.45, 1.32], 'var2': [0.89, 0.19, 1.22, 1.34], 'var3': [1.98, 1.64, 1.21, 2.01] }) df2 = pd.DataFrame({ 'name': ['0002', '0001', '0002', '0004', '0003', '0004', '0001', '0003'], 'var1': [10, 21, 25, 13, 24, 26, 16, 20], 'var2': [25, 31, 14, 21, 55, 14, 19, 18], 'var3': [12, 12, 24, 11, 41, 61, 36, 44] }) # 按name合并,给两个表的同名列加后缀区分 merged_df = df2.merge(df1, on='name', suffixes=('_df2', '_df1')) # 循环计算每个var列的乘积 variables = ['var1', 'var2', 'var3'] for var in variables: merged_df[var] = merged_df[f'{var}_df1'] * merged_df[f'{var}_df2'] # 提取需要的列,得到最终的df3 df3 = merged_df[['name'] + variables] print(df3)
运行后df3的每一行,就是df2对应name的var值,和df1中同name的var值相乘的结果,长度和df2完全一致。
方法二:用map快速匹配(更简洁)
因为df1里的name是唯一的(每个name只出现一次),我们可以把df1转成以name为索引的结构,然后用map快速匹配df2的每一行:
import pandas as pd # 同样先还原你的DataFrame df1 = pd.DataFrame({ 'name': ['0001', '0002', '0003', '0004'], 'var1': [1.08, 2.11, 1.45, 1.32], 'var2': [0.89, 0.19, 1.22, 1.34], 'var3': [1.98, 1.64, 1.21, 2.01] }) df2 = pd.DataFrame({ 'name': ['0002', '0001', '0002', '0004', '0003', '0004', '0001', '0003'], 'var1': [10, 21, 25, 13, 24, 26, 16, 20], 'var2': [25, 31, 14, 21, 55, 14, 19, 18], 'var3': [12, 12, 24, 11, 41, 61, 36, 44] }) # 把df1设置为name索引,方便后续map调用 df1_indexed = df1.set_index('name') # 复制df2作为df3的基础,然后循环计算每个var列的乘积 df3 = df2.copy() variables = ['var1', 'var2', 'var3'] for var in variables: df3[var] = df2[var] * df2['name'].map(df1_indexed[var]) print(df3)
这个方法代码更短,效率也不错,因为map会自动根据name的值,找到df1中对应的var值来做乘法,完美匹配你的需求。
再说说你原代码的问题
你写的df1['name'] == df2['name']是按索引位置逐行对比的——比如df1第0行的'0001'会和df2第0行的'0002'比,而不是去找df2里所有'0001'的行。因为两个DataFrame长度不一样,Pandas没法按索引对齐,所以就抛出了ValueError啦。
内容的提问来源于stack exchange,提问作者coding_anon
相关产品推荐
相关产品推荐

