You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取Pandas DataFrame各列的最小值、最大值及对应行索引?

获取Pandas DataFrame各列的最小值和最大值(含对应行标签)

首先,先还原你的DataFrame方便后续操作:

import pandas as pd

data = {
    'achaea': [-22.141701, -13.403537, -20.933825, -8.490766, -17.376165],
    'bacteria': [-27.891441, -21.490028, -14.761891, -9.910195, -18.653078],
    'plastids': [-2.474725, -0.403491, 4.681494, 1.150736, -1.525354],
    'mitochondrion': [0.262533, -0.271403, -0.098965, -0.005730, -0.708633],
    'viruses': [0.026349, -0.243087, 0.088650, 0.508743, -1.917676]
}
df = pd.DataFrame(data, index=['CTAG', 'GGCC', 'GATC', 'CATG', 'TAAG'])

你需要的是同时获取每列的极值(最小/最大)以及对应的行索引(比如CTAG、TAAG这类标签),并按指定格式输出。你之前尝试的df.min()只能拿到值,单独用idxmin()只能针对单列,循环的方式又没对应对关系,这里给你两个简洁的实现方法:

方法一:使用apply遍历列处理

获取最小值及对应行标签

# 对每一列,提取最小值对应的行索引和数值
min_details = df.apply(lambda col: pd.Series([col.idxmin(), col.min()], index=['row_label', 'min_value']))

# 按你想要的格式输出
print("最小值:")
for col_name in min_details.columns:
    row = min_details[col_name]['row_label']
    val = min_details[col_name]['min_value']
    print(f"{col_name} {row} {val}")

输出结果:

最小值:
achaea CTAG -22.141701
bacteria CTAG -27.891441
plastids CTAG -2.474725
mitochondrion TAAG -0.708633
viruses TAAG -1.917676

获取最大值及对应行标签

只需要把idxmin()换成idxmax(),min()换成max()即可:

max_details = df.apply(lambda col: pd.Series([col.idxmax(), col.max()], index=['row_label', 'max_value']))

print("\n最大值:")
for col_name in max_details.columns:
    row = max_details[col_name]['row_label']
    val = max_details[col_name]['max_value']
    print(f"{col_name} {row} {val}")

输出结果:

最大值:
achaea CATG -8.490766
bacteria CATG -9.910195
plastids GATC 4.681494
mitochondrion CTAG 0.262533
viruses CATG 0.508743

方法二:使用agg聚合函数

如果你想更紧凑地获取结果,可以用agg同时指定两个聚合操作:

min_result = df.agg({
    'row_label': lambda x: x.idxmin(),
    'min_value': lambda x: x.min()
}).T  # 转置后列名就是原DataFrame的列,更方便输出

max_result = df.agg({
    'row_label': lambda x: x.idxmax(),
    'max_value': lambda x: x.max()
}).T

之后同样可以用循环输出成你想要的格式,效果和方法一完全一致。

为什么你之前的循环不对?

你之前的循环for col, idx in zip(df.columns, df.index):是把列名和行索引一一对应遍历,这完全是错位的——我们需要的是针对每一列,找到该列中极值对应的行索引,而不是把列和行按顺序配对。

内容的提问来源于stack exchange,提问作者Paulo Sergio Schlogl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 22:18:13