【问题标题】:Python: How to iterate through a DataFrame into MailMerge fields?Python:如何将 DataFrame 迭代到 MailMerge 字段中?
【发布时间】:2018-12-27 21:48:19
【问题描述】:

问题是使用 MailMerge 方法生成的每个文件都具有从第一次迭代到 i 循环的相同合并字段数据,即使通过循环 i[0] 打印的相同索引约定将正确显示当我打印每次迭代时,以及那些相同的索引引用用于在每次循环中按预期命名每个 .docx。

代码:

import pandas as pd
from mailmerge import MailMerge
import numpy as np

df1 = xl.parse('Sheet1')
df2 = pd.DataFrame(df1)
data1 = np.array(df2)
template = "Form_Template.docx"
document = MailMerge(template)   



    for i in data1:
        document.merge(
            Name= i[0],
            Domain= 'fruitcorp.local',
            userid= i[1],
            Password= '*',
            date_ini='{:%d-%b-%Y}_______'.format(date.today()),
            comment='* This is a replacement for a missing original form.            
             Original start date was: ',
            startdate= str(i[3]))
         print(i[0])
         document.write(i[1] + 'Replacement_Account_Acceptance_Form.docx')

这是我得到的显示输出:

 In: print(data1):
 Out:[['Apple Jacks' 'ajacks' Timestamp('2015-07-26 18:49:11') '26-Jul-015']
 ['Orange Gladys' 'ogladys' Timestamp('2015-01-05 18:50:38')
  '05-Jan-2015']
 ['Ed Banana' 'ebanana' Timestamp('2017-01-09 18:51:47') '09-Jan-2017']
 ['Kiwi Lime' 'klime' Timestamp('2015-02-09 18:52:42') '09-Feb-2015']
 ['Pie Cheesecake' 'pcheesecake' Timestamp('2011-07-28 14:06:26')
  '28-Jul-2011']]

#iterated properly:

In: for i in data1:
         print(i[0])
Out: Apple Jacks
Orange Gladys
Ed Banana
Kiwi Lime
Pie Cheesecake

但同样的索引调用

我[0]

在 document.merge 函数的 'Name' 字段和 i[0] 中类似地对于 'userid' 字段,导致迭代值保持为 ['Apple Jacks' 'ajacks' Timestamp('2015-07- 26 18:49:11') '26-Jul-2015'] 每次迭代

In: for i in data1:
        document.merge(
           Name= i[0],
           startdate= str(i[3]),
           userid= i[1]))

Out:  Name= Apple Jacks
      startdate= 26-Jul-2015
      userid= ajacks

      Name= Apple Jacks
      startdate= 26-Jul-2015
      userid= ajacks

      Name= Apple Jacks
      startdate= 26-Jul-2015
      userid= ajacks 

      Name= Apple Jacks
      startdate= 26-Jul-2015
      userid= ajacks

      Name= Apple Jacks
      startdate= 26-Jul-2015
      userid= ajacks

相同的数据每 (5) 次重复,而不是产生 5 个唯一的集合 我能想到的是,当我在 MailMerge 方法中时,我没有正确使用 DataFrame 索引。

...改用 i[0][0] 吗?

In: for i in data1:
        document.merge(
           Name= i[0][0],
           startdate= str(i[3][0]),
           userid= i[1][0]))

Out:  Name= A
      startdate= 2
      userid= a

      Name= A
      startdate= 2
      userid= a

      Name= A
      startdate= 2
      userid= a

      Name= A
      startdate= 2
      userid= a

      Name= A
      startdate= 2
      userid= a

(将我的关系数据作为字典访问会更简单吗?) 主要问题是:我怎样才能最好地让每个生成的文档包含来自循环的每次迭代的正确字段数据,而不是当前每个包含第一行数据(所有生成的文档都包含:'Apple Jacks, ajacks, 26-Jul -2015' 在他们的合并字段中)

【问题讨论】:

  • 这感觉不像是一个最小的例子。见minimal reproducible example
  • 我很抱歉没有把这个作为一个最小的例子。我是这里的新手,也是 python 的新手,我认为在我完全错误的情况下展示完整的方法会很有帮助
  • 如果我理解正确,您只需要再索引一次:如果i[0]['Apple Jacks', 'ajacks', Timestamp('2015-07-26 18:49:11'), '26-Jul-2015'],那么i[0][0]'Apple Jacks'
  • 虽然我觉得我理解正确,但是文字太多了。您可以简单地将您的问题编辑成这样:(1)这是我的代码,(2)这是我的输入,(3)这是我得到的,(4)这是我想要 得到。
  • “这就是我得到的”我的意思是正是你得到的复制/粘贴的,不是你自己的话描述的。

标签: python-3.x dataframe for-loop mailmerge numpy-ndarray


【解决方案1】:

我发现问题在于在循环之前使用 MailMerge 方法。每次迭代(因此在内部)循环都需要初始化文档变量:

from mailmerge import MailMerge
import pandas as pd

df3 = pd.DataFrame(df1, index = range(int(len(df2.index))))
looprange = range(int(len(df3.index)))

for j in looprange:
#The following line was previously before the loop. It MUST be here: 
    document = MailMerge(template)
    document.merge(
        Name= df3.name[j],
        Domain= 'fruitcorp.local',
        userid= df3.SamAccountName[j],
        Password= '*',
        date_ini='{:%d-%b-%Y}_______'.format(date.today()),
        comment='* This is a replacement for a missing original form. 
        Original start date was: ',
        startdate= df3.WhenCreatedFormated[j])
    document.write(df3.SamAccountName[j] + '_Replacement_Account_Acceptance_Form.docx')

【讨论】:

    猜你喜欢
    • 2019-06-16
    • 2020-05-25
    • 1970-01-01
    • 2018-10-13
    • 2019-04-05
    • 2018-09-23
    • 2017-01-12
    • 1970-01-01
    • 2020-05-21
    相关资源
    最近更新 更多