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

多条件查找DataFrame未知列资产值及代码优化、shift方法问询

资产类别分配数据提取问题解答

问题1:未知Equities所在列索引,如何定位并获取对应数值?

可以通过全局查找资产名称的位置摆脱列索引依赖,步骤如下:

  1. 先定位"Allocation by Asset Class"板块的起始行索引;
  2. 从起始行开始,将DataFrame转为堆叠格式(stack),找到值为"Equities"的单元格坐标(行+列);
  3. 取该坐标下一行、同一列的数值。

示例代码:

# 定位资产分配板块起始行
asset_start_idx = df[df[0] == 'Allocation by Asset Class'].index[0]
# 查找Equities所在的单元格位置(行号、列号)
equities_pos = df.loc[asset_start_idx:].stack()[lambda s: s == "Equities"].index[0]
# 获取对应数值(假设数值在Equities单元格的下一行同一列)
equities_value = df.iat[equities_pos[0] + 1, equities_pos[1]]

问题2:现有代码冗余可读性差,该如何优化?

核心思路是拆解逻辑、封装复用,把重复的提取逻辑做成通用函数,同时给变量起有意义的名字:

优化方案:封装通用提取函数

def get_asset_allocation_value(df, asset_name):
    # 1. 定位资产分配板块的起始行
    asset_start_idx = df[df[0] == 'Allocation by Asset Class'].index[0]
    # 2. 截取该板块的子DataFrame
    asset_subset = df.loc[asset_start_idx:]
    # 3. 找到资产名称所在的单元格坐标
    asset_pos = asset_subset[asset_subset == asset_name].stack().index[0]
    # 4. 返回对应数值(下一行同一列)
    return df.iat[asset_pos[0] + 1, asset_pos[1]]

# 批量获取各资产数值
equities = get_asset_allocation_value(df, "Equities")
fixed_income = get_asset_allocation_value(df, "Fixed Income")
real_estate = get_asset_allocation_value(df, "Real Estate")
cash = get_asset_allocation_value(df, "Cash")

这种方式不仅可读性强,还能复用逻辑处理多个资产,后续维护也更方便。

问题3:执行df.loc[(df[0] == 'Allocation by Asset Class') & (df[3] == "Equities")].shift(1)后输出全为NaN,为何无法得到预期下一行数据?

原因有两个:

  1. 筛选结果范围太小:df.loc[...]筛选出来的是单个匹配行(甚至空行),对这个只有一行的子DataFrame执行shift(1)(向上偏移),会把当前行的数据移到上一行,但子DataFrame没有上一行的索引,所以所有值变成NaN;
  2. 偏移方向错误:你需要的是下一行数据,应该用shift(-1)(向下偏移),但即使改方向,单个行的子DataFrame偏移后也会因为没有下一行索引而返回NaN。

正确做法:直接通过索引定位下一行

# 先找到匹配行的索引
match_idx = df.loc[(df[0] == 'Allocation by Asset Class') & (df[3] == "Equities")].index[0]
# 直接取索引+1的行
target_row = df.loc[match_idx + 1]

如果要基于资产板块的子DataFrame操作,也可以先截取板块范围再处理:

asset_start_idx = df[df[0] == 'Allocation by Asset Class'].index[0]
asset_subset = df.loc[asset_start_idx:]
# 找到Equities所在行
equities_row = asset_subset[asset_subset[3] == "Equities"]
# 向下偏移获取下一行
target_row = asset_subset.shift(-1).loc[equities_row.index]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 17:20:57