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

Python中如何通过Series的索引与列名提取DataFrame对应值?

解决方案:提取DataFrame中每行对应Series指定列的数值

我来帮你搞定这个问题!你想要的是精准提取DataFrame中每行(对应Series的索引)与该行指定列(对应Series的值)交叉位置的单个数值,之前的loc用法没命中这个需求,下面给你几个可行的方案:

方法1:利用Numpy对角线提取(直观易懂)

当你用df.loc[s.index, s.values]时,会得到一个每行对应所有Series列名的DataFrame,而我们需要的正好是这个DataFrame的对角线元素(第0行第0列、第1行第1列...),用np.diag()就能直接提取:

import pandas as pd
import numpy as np

# 构造你的示例数据
s = pd.Series(['wkeans', 'wContour', 'wDarkBand', 'wContour'], index=[0,1,2,3])
df = pd.DataFrame({
    'wContour': [92.0, 90.0, 84.0, 84.0],
    'wDarkBand': [0.0, 88.0, 86.0, 0.0],
    'wkeans': [94.0, 84.0, 84.0, 102.0]
})

# 提取目标数值
target_values = np.diag(df.loc[s.index, s.values])
print(target_values)
# 输出: [94. 90. 86. 84.]

方法2:使用df.lookup()(专门的行列匹配方法)

Pandas提供了lookup()方法,专门用于根据行索引和列名的对应关系提取交叉值,不过注意这个方法在Pandas 1.2.0之后被标记为弃用,但目前仍可使用:

target_values = df.lookup(s.index, s.values)
print(target_values)
# 输出同样的结果

方法3:列表推导式(灵活高效)

如果你想避免依赖Numpy或者弃用的方法,用列表推导式遍历Series的索引和值,逐个提取对应位置的数值也很方便:

target_values = [df.loc[row_idx, col_name] for row_idx, col_name in s.items()]
print(target_values)
# 输出: [94.0, 90.0, 86.0, 84.0]

为什么之前的方法无效?

  • dfW.loc[myseries]:loc的第一个参数是行索引,你传入的Series会被当作行索引的取值去查找,但你的DataFrame行索引是0-3,而Series的值是列名,自然无法匹配到正确的行。
  • dfW.loc[s.index, s.values]:这个操作会选择所有s.index对应的行,以及s.values列出的所有列,得到的是一个4×4的DataFrame(因为s.values有4个元素,包含重复列),而不是每行对应单个列的目标值。

内容的提问来源于stack exchange,提问作者Viktoriia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:19:25