Python KeyError:0-在数据帧中循环时

Python KeyError:0-在数据帧中循环时,python,pandas,loops,keyerror,Python,Pandas,Loops,Keyerror,提前感谢您在这方面的帮助。我对这件事还是那么陌生,以至于我真的不知道自己在做什么。我已经尝试了很多方法来做这件事,但我总是出错。我尝试过使用iterrows、iloc、loc等等,但没有成功。我不明白如何获取每行数据并使用该行中的值发送电子邮件 代码: #获取所有姓名、电子邮件地址、角色和截止日期。 所有客户=电子邮件列表[“客户名称”] 所有员工=电子邮件列表[“员工姓名”] 所有角色=电子邮件列表['Role'] #所有类型=电子邮件列表[“表单类型”] 所有到期日=电子邮件列表[“到期日”

提前感谢您在这方面的帮助。我对这件事还是那么陌生,以至于我真的不知道自己在做什么。我已经尝试了很多方法来做这件事,但我总是出错。我尝试过使用iterrows、iloc、loc等等,但没有成功。我不明白如何获取每行数据并使用该行中的值发送电子邮件

代码:

#获取所有姓名、电子邮件地址、角色和截止日期。
所有客户=电子邮件列表[“客户名称”]
所有员工=电子邮件列表[“员工姓名”]
所有角色=电子邮件列表['Role']
#所有类型=电子邮件列表[“表单类型”]
所有到期日=电子邮件列表[“到期日”]
所有电子邮件=电子邮件列表[“员工电子邮件”]
对于范围内的idx(len(电子邮件列表)):
#获取每个记录的名称、电子邮件、主题和消息
客户机=所有_客户机[idx]
职员=所有职员[idx]
角色=所有_角色[idx]
#表格类型=所有类型[idx]
到期日=所有到期日[idx]
电子邮件地址=所有电子邮件[idx]
#获取所有姓名、电子邮件地址、角色和截止日期。
subject=f“您的每月摘要在{client.upper()}的{Due_date}天到期”
message=f“嗨{staff.title()},\n\n{form\u type}在{client.upper()}的{due\u date}天内到期。请在到期日之前提交。\n\n银行,\n\n研究”
完整电子邮件=(“发件人:{0}\n”
“收件人:{2}\n”
“主题:{4}\n\n”
"{5}"
.format(您的姓名、电子邮件、员工、电子邮件地址、主题、消息))
#在电子邮件字段中,如果需要,可以添加多封其他电子邮件
#所有人都希望收到相同的文本
尝试:
sendmail(您的电子邮件,[电子邮件地址],完整电子邮件)
打印('发送到{}的电子邮件成功!\n\n'。格式(电子邮件地址))
例外情况除外,如e:
print('Email to{}无法发送:(因为{}\n\n'。格式(Email_地址,str(e)))
#关闭smtp服务器
server.close()
email\u list.iterrows()
返回一个迭代器,该迭代器在数据帧中生成索引以及该索引的行。因此,可以按如下方式进行迭代:

for idx, row in email_list.iterrows():
    # Get each records name, email, subject and message
    client = row['Client Name']
    staff = row['Staff Name']
    role = row['Role']
    #form_type = row['Form Type']
    due_date = row['Due Date']
    email_address = row['Staff Email']

    # Get all the Names, Email Addresses, roles and due dates.
    subject = f"Your monthly summary was Due on {due_date} Days For {client.upper()}"
    message = f"Hi {staff.title()}, \n\nThe {form_type} is due in {due_date} days for {client.upper()}.  Please turn it in before the due date. \n\nThanks, \n\nJudy"

您可以了解有关pandas.DataFrame.iterrows()的更多信息。

email\u list.iterrows()返回一个迭代器,该迭代器在数据帧中生成索引以及该索引的行。因此,可以按如下方式进行迭代:

for idx, row in email_list.iterrows():
    # Get each records name, email, subject and message
    client = row['Client Name']
    staff = row['Staff Name']
    role = row['Role']
    #form_type = row['Form Type']
    due_date = row['Due Date']
    email_address = row['Staff Email']

    # Get all the Names, Email Addresses, roles and due dates.
    subject = f"Your monthly summary was Due on {due_date} Days For {client.upper()}"
    message = f"Hi {staff.title()}, \n\nThe {form_type} is due in {due_date} days for {client.upper()}.  Please turn it in before the due date. \n\nThanks, \n\nJudy"


您可以了解有关pandas.DataFrame.iterrows()的更多信息。

提取所有列然后获取相应元素是一种错误的模式 从每个这样的变量(包含一列)

请使用以下模式:

for idx, row in email_list.iterrows():
    row.Role
    row['Staff Name']
如果您不使用
idx
,请改为使用

这个变体比你的快得多。上面的代码实际上执行 这里是一个单个迭代(在行上),而您的代码执行:

  • 也是对行号的一次迭代
  • 但是代码对单个元素执行n次查找, 在每列中都有特定索引
让我们回到我的代码示例。 有两种变体可访问当前行的元素:

  • 行.角色
    -如果列名不包含“特殊”字符(例如空格)
  • 行['Staff Name']
    -在其他(更复杂)的情况下
以及您获得KeyError的原因:0。

请注意:

  • 您的行具有以1开头的索引(最左边的列, 没有头衔),
  • 但在循环中,idx从0开始
  • 对每个“列变量”的访问实际上只是由 索引值,而不是“所需”元素的整数位置
因此,错误发生在循环的第一个转弯处,当您:

  • 让idx==0
  • 没有列变量(实际上是一个系列)包含具有 索引==0
实际上熊猫在这里使用了两个不同的名称(键和索引值) 对于同一件事,这在多大程度上是可以讨论的 消息是可读的。 你对此无能为力,你只要知道就行了

或者,如果出于某种原因希望保留当前版本的代码, 仅将指示更改为:

for idx in range(1, len(email_list) + 1):
    ...
然后这个循环将从idx==1开始,只要 因为索引是连续的,从1开始

但正如我所注意到的,您的索引:

  • 从1、2和3开始(到目前为止还不错)
  • 但是还有一个“间隙”,你没有索引为4的行

提取所有列然后获取相应的元素是一种错误的模式 从每个这样的变量(包含一列)

请使用以下模式:

for idx, row in email_list.iterrows():
    row.Role
    row['Staff Name']
如果您不使用
idx
,请改为使用

这个变体比你的快得多。上面的代码实际上执行 这里是一个单个迭代(在行上),而您的代码执行:

  • 也是对行号的一次迭代
  • 但是代码对单个元素执行n次查找, 在每列中都有特定索引
让我们回到我的代码示例。 有两种变体可访问当前行的元素:

  • 行.角色
    -如果列名不包含“特殊”字符(例如空格)
  • 行['Staff Name']
    -在其他(更复杂)的情况下
以及您获得KeyError的原因:0。

请注意:

  • 您的行具有以1开头的索引(最左边的列, 没有头衔),
  • 但在循环中,idx从0开始
  • 对每个“列变量”的访问实际上只是由 索引值,而不是“所需”元素的整数位置
因此,错误发生在循环的第一个转弯处,当您:

  • 让idx==0
  • 没有列变量(实际上是一个系列)包含具有 我