如何基于DataFrame列向量运算结果创建仅保留最大值的自定义矩阵
解决Pandas中DataFrame列两两差值计算与自定义最大值矩阵的问题
别担心,我来一步步帮你搞定这两个需求,用Pandas就能轻松实现。
第一步:计算列的两两差值并生成新DataFrame
首先,我们需要处理原始数据(注意你的数据用逗号作为小数分隔符,读取时要指定decimal=','),然后按照需求计算两两列的差值(这里要注意取绝对值,因为你的示例结果都是正数):
import pandas as pd # 1. 读取或构造原始DataFrame # 如果是从CSV文件读取: # df = pd.read_csv('your_data.csv', decimal=',') # 如果是直接构造(和你提供的数据一致): data = { 'LK': list(range(11, 32)), 'BALG': [0.000,0.000,0.000,0.000,0.001,0.001,0.002,0.007,0.012,0.023,0.040,0.075,0.109,0.140,0.178,0.219,0.260,0.301,0.353,0.405,0.480], 'AMRU': [0.004,0.010,0.034,0.076,0.134,0.211,0.294,0.370,0.434,0.509,0.566,0.628,0.697,0.770,0.828,0.876,0.906,0.929,0.954,0.968,0.978], 'CADZ': [0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.008,0.030,0.054,0.080,0.229,0.363,0.435,0.493,0.536,0.575,0.625,0.660,0.715,0.769] } df = pd.DataFrame(data) # 2. 计算两两列的差值(取绝对值以匹配你的示例结果) df['BALG-AMRU'] = (df['BALG'] - df['AMRU']).abs() df['BALG-CADZ'] = (df['BALG'] - df['CADZ']).abs() df['CADZ-AMRU'] = (df['CADZ'] - df['AMRU']).abs() # 3. 提取需要的列并保留3位小数 result_df = df[['LK', 'BALG-AMRU', 'BALG-CADZ', 'CADZ-AMRU']].round(3) print(result_df)
运行这段代码后,你会得到和你示例完全一致的DataFrame。
第二步:生成基于差值列最大值的自定义矩阵
接下来,我们要提取每个差值列的最大值,然后构造类似相关矩阵的格式:
import numpy as np # 1. 提取各差值列的最大值 max_values = result_df[['BALG-AMRU', 'BALG-CADZ', 'CADZ-AMRU']].max() # 2. 构造自定义矩阵(行列均为差值列名称,对角线填充对应列的最大值) custom_matrix = pd.DataFrame( np.zeros((3, 3)), index=max_values.index, columns=max_values.index ) # 填充对角线值 for col in max_values.index: custom_matrix.loc[col, col] = max_values[col] # 保留3位小数 custom_matrix = custom_matrix.round(3) print(custom_matrix)
如果你希望矩阵中所有位置都显示对应列的最大值(而不仅是对角线),可以修改构造矩阵的代码:
# 构造所有单元格显示对应列最大值的矩阵 custom_matrix = pd.DataFrame( {col: [max_values[col]]*3 for col in max_values.index}, index=max_values.index ).round(3)
运行后你会得到符合需求的自定义矩阵,其中每个差值列对应的最大值会清晰展示。
内容的提问来源于stack exchange,提问作者Suusie
相关产品推荐
相关产品推荐

