多条件查找DataFrame未知列资产值及代码优化、shift方法问询
资产类别分配数据提取问题解答
问题1:未知Equities所在列索引,如何定位并获取对应数值?
可以通过全局查找资产名称的位置摆脱列索引依赖,步骤如下:
- 先定位"Allocation by Asset Class"板块的起始行索引;
- 从起始行开始,将DataFrame转为堆叠格式(stack),找到值为"Equities"的单元格坐标(行+列);
- 取该坐标下一行、同一列的数值。
示例代码:
# 定位资产分配板块起始行 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,为何无法得到预期下一行数据?
原因有两个:
- 筛选结果范围太小:
df.loc[...]筛选出来的是单个匹配行(甚至空行),对这个只有一行的子DataFrame执行shift(1)(向上偏移),会把当前行的数据移到上一行,但子DataFrame没有上一行的索引,所以所有值变成NaN; - 偏移方向错误:你需要的是下一行数据,应该用
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
相关产品推荐
相关产品推荐

