pandas TypeError:列表索引必须是整数或切片,而不是str -处理 Dataframe

w8biq8rn  于 2022-11-20  发布在  其他
关注(0)|答案(1)|浏览(190)

我在下面的一个项目中遇到了错误,我寻找了一些解释(比如this page),我得到了错误的原因。但是我不知道在这种情况下可能是什么问题。

Traceback (most recent call last):
  File "c:\Users\luisa.oliveira\Programs\VScode\dashboard-ecg-atualizado\app\views\dashboard.py", line 688, in n_protocolo_callback
    g1, quantidades = graficos(
  File "c:\Users\luisa.oliveira\Programs\VScode\dashboard-ecg-atualizado\app\views\dashboard.py", line 51, in graficos
    desejados = ids[ids["ID"] == numero]["Protocolo"]
TypeError: list indices must be integers or slices, not str

第688行一些背景:

def n_protocolo_callback(data, laudos, idade, sexo, operacao, pagina, quais_graficos):

    idade = faixas_idades.get(idade)
    idade_inicial, idade_final = None, None
    sexo = sexos.get(sexo)
    if idade:
        idade_inicial, idade_final = idade
    ids = laudos

    dados.loc[:, "Data"] = pd.to_datetime(dados.loc[:, "Data"])
    # cria primeiro gráfico
    g1, quantidades = graficos(
        dados, ids, data, laudos, [idade_inicial, idade_final], sexo
    )

功能开始:绘图()

def graficos(dados, ids, data, laudos, idade, sexo):
    data_inicial, data_final = data
    idade_inicial, idade_final = idade
    figura = []
    n_laudos = [numeros_diagnosticos.get(laudo) for laudo in laudos]
    mostrar = []

    for i, (nome, numero) in enumerate(zip(laudos, n_laudos)):
        desejados = ids[ids["ID"] == numero]["Protocolo"]

编辑:“ids”是pd.read_csv读取的包含2列(ID和协议)的csv。“numero”是整数,“nome”是字符串
我认为这个问题与用“ID”索引ID有关,但我不确定这是否正确,也不知道如何解决

bfnvny8b

bfnvny8b1#

只要全局变量位于赋值语句的右侧,就可以在函数内部访问它们:

# Global variable
x = 3

def fun():
   # assign value of global variable x to local variable y
   y = x

但是,如果在赋值语句的左侧有一个与全局变量同名的变量,则需要在函数中创建一个局部变量:

# Global variable
x = 3

def fun():
   # Initialize local variable
   x = 5
   print(x)

print(x)  # prints 3
fun()     # prints 5
print(x)  # prints 3

fun()会将不同的值指派给x,但不会影响外部的全局变量。
如果你定义了一个函数,那么所有的参数都是局部作用域的,当你把这些参数传递给函数时,Python会在当前作用域中检查所有变量名,只有在没有找到所有变量的情况下才会进入下一个作用域。

# Global variabl
x = 3

def outer():
   def inner(x):
      print(x)
   inner(x)

outer()  # Prints 3

尽量避免使用global变量,因为它们会使代码变得模糊。我删除了不影响结果的部分,以便进行以下解释:

import pandas as pd

# global variables
ids = pd.DataFrame({"ID":[1, 2, 3, 4, 5, 6], "Protocolo":[444, 555, 666, 777, 888, 999,]})

# Presumably some list as this caused your TypeError
laudos = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

def n_protocolo_callback(laudos):
    # Initialize a local variable ids with values from laudos
    ids = laudos
    # Calling graficos with local variable of ids
    g1, quantidades = graficos(ids, laudos)

# Define local variable of ids in the scope of function graficos
def graficos(ids, laudos):
    n_laudos = [numeros_diagnosticos.get(laudo) for laudo in laudos]

    for i, (nome, numero) in enumerate(zip(laudos, n_laudos)):
        # Accessing local variable ids
        desejados = ids[ids["ID"] == numero]["Protocolo"]

# Calling n_protocolo_callback will cause a TypeError
# n_protocolo_callback(laudos)

当您在n_protocolo_callback内使用laudos的值重新指派ids,然后将局部变量传递给graficos时,就会发生此错误。
当你使用global变量时,你不需要将它们作为参数添加到你的函数中。
TypeError是由于list不能用字符串进行索引而引起的。正如错误消息所示,您可以使用整数或切片进行索引,即:

l = [555, 666, 777, 888, 999]

# Accessing first element using integer
print(l[0])  # prints 555

# Accessing first 3 elements using slice:
print(l[0:3])  # prints [555, 666, 777]

相关问题