如何利用另一DataFrame的列最大值索引提取pandas DataFrame值?
问题分析与解决方案
你当前使用df1.loc[df2.idxmax()]得到整行数据,是因为loc是按行索引提取整行,而你需要的是每一列对应df2同列最大值所在行的单个值(即行列一一匹配的精准取值)。以下是几种可行的实现方法:
方法1:用DataFrame.lookup(最直接的行列匹配)
lookup方法可以接收行索引数组和列索引数组,直接返回对应交叉位置的元素。df2.idxmax()的值是行索引,索引是列名,刚好符合参数要求:
result = df1.lookup(df2.idxmax().values, df2.idxmax().index) print(result) # 输出: [3 2 1 -1]
方法2:按列遍历匹配
通过apply对每一列单独处理,提取对应df2列最大值行的数值:
result = df1.apply(lambda col: col[df2[col.name].idxmax()], axis=0).tolist() print(result) # 输出: [3, 2, 1, -1]
方法3:用numpy底层索引(大数据量下更高效)
利用numpy的数组索引直接定位,适合处理大规模数据:
import numpy as np # 获取df2每列最大值的行位置(0/1/2对应索引A/B/C) row_indices = df2.values.argmax(axis=0) # 生成列位置数组(0到3对应列a/b/c/d) col_indices = np.arange(df1.shape[1]) # 提取对应位置的值 result = df1.values[row_indices, col_indices] print(result) # 输出: [3 2 1 -1]
原方法失效原因
df1.loc[df2.idxmax()]会将idxmax返回的每个行索引(C、A、B、A)依次作为行标签提取整行数据,因此得到的是4行完整记录,而非你需要的每列单个目标值。
内容的提问来源于stack exchange,提问作者Mate de Vita
相关产品推荐
相关产品推荐

