如何简化获取指定Ticker与财年的DataFrame单元格值的表达式?
简化Pandas数据查询表达式的方法
目标DataFrame
df SimFinId Currency Fiscal Year ... Net Extraordinary Gains (Losses) Net Income Net Income (Common) Ticker Report Date ... A 2018-10-31 45846 USD 2018 ... NaN 316000000 316000000 2019-10-31 45846 USD 2019 ... NaN 1071000000 1071000000 2020-10-31 45846 USD 2020 ... NaN 719000000 719000000 2021-10-31 45846 USD 2021 ... NaN 1210000000 1210000000 2022-10-31 45846 USD 2022 ... NaN 1254000000 1254000000 ... ... ... ... ... ... ... ... ZYXI 2018-12-31 171401 USD 2018 ... NaN 9552000 9552000 2019-12-31 171401 USD 2019 ... NaN 9492000 9492000 2020-12-31 171401 USD 2020 ... NaN 9074000 9074000 2021-12-31 171401 USD 2021 ... NaN 17103000 17103000 2022-12-31 171401 USD 2022 ... NaN 17048000 17048000
需求与原表达式
需求:获取Ticker为A、Fiscal Year为2019的Net Income (Common)单元格值。
原使用表达式:
df[df['Fiscal Year'] == 2019].loc['A','Net Income (Common)'].values[0] 1071000000
简化方案
以下是几种更简洁清晰的写法,均能得到结果1071000000:
方案一:先定位Ticker子集,再筛选年份取值
利用多级索引特性先缩小数据范围,再通过直观方式定位目标值:
# query语法更贴近自然语言 df.loc['A'].query("`Fiscal Year` == 2019")['Net Income (Common)'].iloc[0] # 或用布尔索引 df.loc['A'][df.loc['A']['Fiscal Year'] == 2019]['Net Income (Common)'].iloc[0]
方案二:直接用query多条件查询
通过query一次性组合两个筛选条件,列名含空格时用反引号包裹:
df.query("Ticker == 'A' and `Fiscal Year` == 2019")['Net Income (Common)'].iloc[0]
方案三:结合loc与索引层级筛选
通过索引层级获取Ticker条件,配合Fiscal Year的布尔索引完成查询:
df.loc[df.index.get_level_values('Ticker') == 'A', 'Net Income (Common)'][df['Fiscal Year'] == 2019].iloc[0]
其中方案一和方案二的可读性最优,推荐优先使用。
内容的提问来源于stack exchange,提问作者showkey
相关产品推荐
相关产品推荐

