如何对比同结构DataFrame并生成取最大值的新DataFrame
解决同结构DataFrame逐元素取最大值并标注来源的问题
方法思路
要实现两个列名、索引完全一致的DataFrame逐位置取最大值,并标注值的来源,可分为三步:
- 计算每个位置的最大值
- 根据最大值的来源生成对应标注文本
- 将最大值与标注文本拼接得到最终结果
完整代码示例
import pandas as pd import numpy as np # 构建示例中的DataFrame df1 = pd.DataFrame( {'col_1': [4, 3], 'col2': [7, 4], 'col-3': [4, 1]}, index=['rft_12312', 'rft_321321'] ) df2 = pd.DataFrame( {'col_1': [7, 3], 'col2': [3, 7], 'col-3': [4, 6]}, index=['rft_12312', 'rft_321321'] ) # 1. 计算逐元素的最大值 max_values = pd.DataFrame(np.maximum(df1, df2), index=df1.index, columns=df1.columns) # 2. 生成来源标注文本 source_annotations = np.where( df2 > df1, "(因df2该位置值大于df1)", np.where(df1 > df2, "(因df1该位置值大于df2)", "(值相等时来源不限)") ) # 3. 合并最大值与标注,得到最终结果 result_df = max_values.astype(str) + source_annotations
输出结果
执行上述代码后,result_df的内容与需求完全匹配:
col_1 col2 col-3 rft_12312 7(因df2该位置值大于df1) 7(因df1该位置值大于df2) 4(值相等时来源不限) rft_321321 3(值相等时来源不限) 7(因df2该位置值大于df1) 6(因df2该位置值大于df1)
为什么pd.update和pd.compare不适用
pd.update仅支持用另一个DataFrame的值覆盖当前DataFrame,无法实现"取最大值"的逻辑pd.compare的作用是对比两个DataFrame的差异并输出差异位置,不能直接生成包含最大值的结果集
内容的提问来源于stack exchange,提问作者Iksy97
相关产品推荐
相关产品推荐

