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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 17:01:08