如何在循环中将许多文件附加到数据框中

时间:2019-07-23 11:13:39

标签: python pandas loops dataframe

我正在尝试从许多docs文件中提取数据,并将其附加到数据框中。

我编写的代码在处理单个文件时效果很好,但是我似乎无法在数据框中追加更多文件。

import re
import docx2txt
import pandas as pd
import glob

df2=pd.DataFrame()
appennded_data=[]

for file in glob.glob("*.docx"):
    text = docx2txt.process(file)
    a1=text.split()
    d2=a1[37]
    doc2=re.findall("HB0....",text)
    units2=re.findall("00[0-9]...",text) 
    df2['Units']=units2
    df2['Doc']=doc2[0]
    df2['Date']=d2
df2

这给出了一个错误 “值的长度与索引的长度不匹配”

预期输出-

从docx1 :(我知道)

Units |  Doc    |   Date

001   |  HB00001 | 23/4/12

002   |  HB00001 | 23/4/12

003   |  HB00001 | 23/4/12

004   |  HB00001 | 23/4/12

005   |  HB00001 | 23/4/12

来自docx2:

Units |  Doc    |   Date

010   |  HB00002 | 2/6/16

011   |  HB00002 | 2/6/16

最终输出:

Units |  Doc    |   Date

001   |  HB00001 | 23/4/12

002   |  HB00001 | 23/4/12

003   |  HB00001 | 23/4/12

004   |  HB00001 | 23/4/12

005   |  HB00001 | 23/4/12

010   |  HB00002 | 2/6/16

011   |  HB00002 | 2/6/16

任何帮助将不胜感激

2 个答案:

答案 0 :(得分:0)

错误是因为列的长度不同。在处理第二个文件时,它将尝试将列设置为与第一个文件具有不同长度的值。您不能为列分配与现有列不同的值。

由于您希望最终的df具有['Units', 'Doc', 'Date']列,因此您可以创建一个空白df并将新结果附加到其上。使用ignore_index=True仅将其追加到下面,而不尝试匹配行索引。

import re
import docx2txt
import pandas as pd
import glob


final_df = pd.DataFrame()

for file in glob.glob("*.docx"):
    text = docx2txt.process(file)
    a1 = text.split()
    d2 = a1[37]
    doc2 = re.findall("HB0....", text)
    units2 = re.findall("00[0-9]...", text)

    # because columns are different length, create them as separate df and concat them
    df2 = pd.DataFrame()
    unit_df = pd.DataFrame(units2)
    doc_df = pd.DataFrame(doc2[0])
    date_df = pd.DataFrame(d2)
    # join them by columns. Any blanks will become NaN, but that's because your data has uneven lengths 
    df2 = pd.concat([df2, unit_df, doc_df, date_df], axis=1)

    # at the end of the loop, append it to the final_df
    final_df = pd.concat([final_df, df2], ignore_index=True)

print(final_df)

答案 1 :(得分:0)

我的建议是首先使用内容构建字典,最后创建DataFrame:

import re
import docx2txt
import pandas as pd
import glob

columns = ['Units', 'Doc', 'Date']

data = {col: [] for col in columns}

for file in glob.glob("*.docx"):
    text = docx2txt.process(file)
    a1=text.split()
    d2=a1[37]
    doc2=re.findall("HB0....",text)
    units2=re.findall("00[0-9]...",text) 
    data['Units'].extend(units2)
    data['Doc'].extend(doc2[0])
    data['Date'].extend(d2)

df2 = pd.DataFrame(data)