Pandas操作Excel:loc[]与iloc[]组合取值失败问题排查
解决Pandas中loc与iloc组合使用的AttributeError问题
问题原因
当Excel中TICKER索引唯一时,ExcelPD.loc[TICKER]返回的是Series对象(而非DataFrame),此时.iloc[-1]会直接提取该Series的最后一个元素(比如字符串类型),后续再调用.loc['BUY PRICE']自然会触发AttributeError——因为字符串没有loc属性。只有当索引重复时,ExcelPD.loc[TICKER]才会返回包含多行的DataFrame,此时.iloc[-1]取到的是最后一行的Series,才能继续用.loc取列值。
解决方案
先通过布尔索引筛选出目标TICKER对应的所有行,再取最后一行得到目标Series,之后直接用方括号[]访问列名即可。同时可以优化后续行索引的获取逻辑,让代码更简洁健壮。
修改后的代码
tradeStopLoss = 5 def sellWriter(tradeStopLoss): import pandas as pd import datetime as dt import pytz import numpy as np now = dt.datetime.now(pytz.timezone('US/Eastern')) ExcelPD = pd.read_excel(r"xxx.xlsx") ExcelPD.set_index('TICKER', inplace=True) TICKER = 'TSLA' DIAYHORAVENTA = now.strftime("%m/%d/%Y %H:%M:%S") PRECIOVENTA = 5466 # 筛选TSLA的所有行,取最后一行得到Series target_row = ExcelPD[ExcelPD.index == TICKER].iloc[-1] BUY_PRICE = target_row['BUY PRICE'] RISK = target_row['RISK'] QUANTITY = target_row['QUANTITY'] # 计算各项指标 RETORNO = round((PRECIOVENTA - BUY_PRICE) / BUY_PRICE, 2) MULTIPLORIESGO = round(RETORNO / RISK, 2) PROFITORLOSS = (PRECIOVENTA - BUY_PRICE) * QUANTITY # 获取目标行的整数索引 idx = ExcelPD.index.get_indexer_for([TICKER])[-1] col1 = ExcelPD.columns.get_loc('SELL DATE') col2 = ExcelPD.columns.get_loc('SELL PRICE') col3 = ExcelPD.columns.get_loc('RETURN') col4 = ExcelPD.columns.get_loc('RISK MULTIPLE') col5 = ExcelPD.columns.get_loc('P/L') ExcelPD.iloc[idx, col1] = DIAYHORAVENTA ExcelPD.iloc[idx, col2] = PRECIOVENTA ExcelPD.iloc[idx, col3] = RETORNO ExcelPD.iloc[idx, col4] = MULTIPLORIESGO ExcelPD.iloc[idx, col5] = PROFITORLOSS ExcelPD.to_excel(r"xxx.xlsx")
关键修改点
- 用
ExcelPD[ExcelPD.index == TICKER].iloc[-1]替代原有的ExcelPD.loc[TICKER].iloc[-1],确保无论索引是否重复,都能正确获取目标行的Series。 - 将重复的
ExcelPD.loc[TICKER].iloc[-1].loc['XXX']提取为变量target_row,提高代码可读性和执行效率。 - 用
ExcelPD.index.get_indexer_for([TICKER])[-1]替代原有的numpy索引逻辑,更符合Pandas的惯用写法。
内容的提问来源于stack exchange,提问作者VV33
相关产品推荐
相关产品推荐

