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
相关产品推荐
相关产品推荐

