如何获取矩阵交叉值并写入Pandas主DataFrame的新增列
我们可以通过两种主流方案实现需求,首先约定变量名:主DataFrame记为df,存储交叉值的矩阵DataFrame记为matrix_df。
方案1:表合并实现(逻辑清晰,兼容性强)
先把宽格式的矩阵转换为长格式,再和主表按A、B两列关联即可:
# 给矩阵的行、列索引命名方便转换格式 matrix_long = matrix_df.rename_axis(index='A', columns='B')\ .reset_index()\ .melt(id_vars='A', var_name='B', value_name='C') # 关联匹配值 df = df.merge(matrix_long, on=['A', 'B'], how='left')
方案2:索引直接取值(性能更高,适合大数据量场景)
利用矩阵的行、列索引直接匹配取值,不需要额外做表转换:
# 给矩阵的行索引命名为A matrix_df = matrix_df.rename_axis('A') # 直接按行、列匹配取值(pandas全版本兼容) df['C'] = df.apply(lambda row: matrix_df.loc[row['A'], row['B']], axis=1)
如果你的pandas版本较旧,也可以直接用lookup方法实现更高性能的取值:
df['C'] = matrix_df.lookup(df['A'], df['B'])
新版本pandas中可以用下面的写法替代lookup,性能远高于apply:
df['C'] = matrix_df.reindex(df['A'])[df['B']].to_numpy().diagonal()
两种方案最终输出的结果都和预期效果一致。
内容的提问来源于stack exchange,提问作者Cookye
相关产品推荐
相关产品推荐

