如何用Pandas实现不同大小DataFrame按指定列匹配除法运算
解决Pandas中按组匹配的除法运算问题
这事儿其实很简单,我们可以用两种常见的方法来实现你要的按col1分组的除法操作,我给你详细讲讲:
方法一:利用索引匹配(高效简洁)
这种方法不需要合并整个DataFrame,直接通过索引映射对应的值来做除法,性能更好,适合数据量较大的场景:
import pandas as pd # 先构造你的两个DataFrame df1 = pd.DataFrame({ 'col1': ['A', 'A', 'B', 'B'], 'col2': ['g', 'd', 'h', 'p'], 'Val1': [4, 3, 5, 7], 'Val2': [6, 8, 10, 14] }) df2 = pd.DataFrame({ 'col1': ['A', 'B'], 'Val1': [2, 1], 'Val2': [3, 4] }) # 把df2的索引设置为col1,这样就能通过df1的col1直接定位对应行 df2 = df2.set_index('col1') # 对df1的Val1和Val2列执行除法,用df1的col1去匹配df2的对应值 result_df = df1.copy() result_df[['Val1', 'Val2']] = result_df[['Val1', 'Val2']].div(df2.loc[result_df['col1']].values) print(result_df)
运行后你就能得到想要的结果:
col1 col2 Val1 Val2 0 A g 2.0 2.0 1 A d 1.5 2.0 2 B h 5.0 2.5 3 B p 7.0 3.5
方法二:合并后再除法(直观易理解)
如果刚接触Pandas,这种方法逻辑更直白——先把两个DataFrame按col1合并,再做列之间的除法:
import pandas as pd # 同样先构造DataFrame df1 = pd.DataFrame({ 'col1': ['A', 'A', 'B', 'B'], 'col2': ['g', 'd', 'h', 'p'], 'Val1': [4, 3, 5, 7], 'Val2': [6, 8, 10, 14] }) df2 = pd.DataFrame({ 'col1': ['A', 'B'], 'Val1': [2, 1], 'Val2': [3, 4] }) # 合并两个DataFrame,给df2的列加后缀区分 merged = df1.merge(df2, on='col1', suffixes=('', '_ref')) # 执行除法,然后删除临时列 merged['Val1'] = merged['Val1'] / merged['Val1_ref'] merged['Val2'] = merged['Val2'] / merged['Val2_ref'] result_df = merged.drop(columns=['Val1_ref', 'Val2_ref']) print(result_df)
两种方法都能得到你要的结果,选哪种就看你的习惯和数据规模啦~
内容的提问来源于stack exchange,提问作者Zanam




