【问题标题】:Import multiple excel files into python pandas and concatenate them into one dataframe将多个excel文件导入python pandas并将它们连接到一个数据帧中
【发布时间】:2014-01-21 09:08:20
【问题描述】:

我想将目录中的几个 excel 文件读入 pandas 并将它们连接到一个大数据框中。我一直无法弄清楚。我需要一些有关 for 循环和构建串联数据框的帮助: 这是我到目前为止所拥有的:

import sys
import csv
import glob
import pandas as pd

# get data file names
path =r'C:\DRO\DCL_rawdata_files\excelfiles'
filenames = glob.glob(path + "/*.xlsx")

dfs = []

for df in dfs: 
    xl_file = pd.ExcelFile(filenames)
    df=xl_file.parse('Sheet1')
    dfs.concat(df, ignore_index=True)

【问题讨论】:

  • 您在另一个问题中的代码很好,只需将read_csv 替换为read_excel
  • 您的代码在这里并不正确(它在另一个问题中)。您不能循环遍历刚刚创建的空列表 dfs,因此循环遍历文件名,然后循环中的 dfs.append(df),然后是 pd.concat(dfs, ignore_index=True)
  • 你能编辑我的代码吗,因为我是 python 的初学者
  • 请看看你的其他问题。
  • 好的,谢谢,现在可以了!!!

标签: python excel pandas concatenation


【解决方案1】:

正如 cmets 中所述,您犯的一个错误是您正在循环一个空列表。

以下是我的做法,以 5 个相同的 Excel 文件逐个附加的示例为例。

(1) 进口:

import os
import pandas as pd

(2) 列出文件:

path = os.getcwd()
files = os.listdir(path)
files

输出:

['.DS_Store',
 '.ipynb_checkpoints',
 '.localized',
 'Screen Shot 2013-12-28 at 7.15.45 PM.png',
 'test1 2.xls',
 'test1 3.xls',
 'test1 4.xls',
 'test1 5.xls',
 'test1.xls',
 'Untitled0.ipynb',
 'Werewolf Modelling',
 '~$Random Numbers.xlsx']

(3) 挑选“xls”文件:

files_xls = [f for f in files if f[-3:] == 'xls']
files_xls

输出:

['test1 2.xls', 'test1 3.xls', 'test1 4.xls', 'test1 5.xls', 'test1.xls']

(4)初始化空数据框:

df = pd.DataFrame()

(5) 循环遍历要附加到空数据帧的文件列表:

for f in files_xls:
    data = pd.read_excel(f, 'Sheet1')
    df = df.append(data)

(6) 享受您的新数据框。 :-)

df

输出:

  Result  Sample
0      a       1
1      b       2
2      c       3
3      d       4
4      e       5
5      f       6
6      g       7
7      h       8
8      i       9
9      j      10
0      a       1
1      b       2
2      c       3
3      d       4
4      e       5
5      f       6
6      g       7
7      h       8
8      i       9
9      j      10
0      a       1
1      b       2
2      c       3
3      d       4
4      e       5
5      f       6
6      g       7
7      h       8
8      i       9
9      j      10
0      a       1
1      b       2
2      c       3
3      d       4
4      e       5
5      f       6
6      g       7
7      h       8
8      i       9
9      j      10
0      a       1
1      b       2
2      c       3
3      d       4
4      e       5
5      f       6
6      g       7
7      h       8
8      i       9
9      j      10

【讨论】:

  • 这当然没问题,但我认为在几乎相同的问题stackoverflow.com/questions/20906474/… 中附加到列表然后pd.concat(the_list) 的方法更干净。
  • 谢谢你。我其实可以理解这一点。但是为什么语句中的 f[-3:] :files_xls = [f for f in files if f[-3:] == 'xls']
  • 很高兴能帮上忙!大约 6 个月前,我在你那里学习 Pandas,所以我很高兴能提供任何帮助。 f[-3:] 是我在解析每个字符串。 files 列表本质上是一个字符串列表。因此,在列表理解中,我要求其扩展名(即最后 3 个字符)为“xls”的文件(即字符串)。
  • 我迟到了,但在这种情况下我有一个小小的疑问。如果这些 excel 文件中有多个工作表怎么办?如何把它们也带进来?
  • @ManasJani:您可以查看pd.read_excel 的文档(它们是here)。可以使用sheetname 参数。
【解决方案2】:

这适用于 python 2.x

在 Excel 文件所在的目录中

http://pbpython.com/excel-file-combine.html

import numpy as np
import pandas as pd
import glob
all_data = pd.DataFrame()
for f in glob.glob("*.xlsx"):
    df = pd.read_excel(f)
    all_data = all_data.append(df,ignore_index=True)

# now save the data frame
writer = pd.ExcelWriter('output.xlsx')
all_data.to_excel(writer,'sheet1')
writer.save()    

【讨论】:

    【解决方案3】:
    import pandas as pd
    
    import os
    
    os.chdir('...')
    
    #read first file for column names
    
    fdf= pd.read_excel("first_file.xlsx", sheet_name="sheet_name")
    
    #create counter to segregate the different file's data
    
    fdf["counter"]=1
    
    nm= list(fdf)
    
    c=2
    
    #read first 1000 files
    
    for i in os.listdir():
    
      print(c)
    
      if c<1001:
    
        if "xlsx" in i:
    
          df= pd.read_excel(i, sheet_name="sheet_name")
    
          df["counter"]=c
    
          if list(df)==nm:
    
            fdf=fdf.append(df)
    
            c+=1
    
          else:
    
            print("headers name not match")
    
        else:
    
          print("not xlsx")
    
    
    fdf=fdf.reset_index(drop=True)
    
    #relax
    

    【讨论】:

      【解决方案4】:
      import pandas as pd
      import os
      
      files = [file for file in os.listdir('./Salesfolder')]
      all_month_sales= pd.DataFrame()
      for file in files
          df= pd.read_csv("./Salesfolder/"+file)
          all_months_data=pd.concat([all_months_sales,df])
      all_months_data.to_csv("all_data.csv",index=False)
      

      您可以从文件夹(在我的情况下为 Salesfolder)中读取所有 .xls 文件,对于您的本地路径也是如此。通过 whcih 使用迭代,您可以将它们放入空数据框中,您可以将数据框连接到 this 。我还将所有月份的数据导出到另一个 csv 到一个 csv 文件中

      【讨论】:

      • 希望它能解决问题,但请添加对代码的解释,以便用户完全理解他/她真正想要的。
      【解决方案5】:

      我有多个 excel 文件,每个文件都有一个共同的 id [每个 excel 表都有 id 列]。我尝试了以下方式。我没有得到基于 id 的正确数据框。 将熊猫导入为 pd 导入操作系统

      path=os.getcwd()
      path
      files=os.listdir(path)
      fil_xlsx=[f for f in files if f[-4:]=='xlsx']
      
      df=pd.DataFrame()
      
      for f in fil_xlsx:
          data=pd.read_excel(f,'Sheet1')
          df=df.append(data)
      

      我这样得到一个空数据框。

      df=pd.DataFrame()
            for f in fil_xlsx:
          data=pd.read_excel(f,'Sheet1')
          all1=pd.concat([data,df],ignore_index=True,join="inner")
      

      【讨论】:

        【解决方案6】:

        这可以通过这种方式完成:

        import pandas as pd
        import glob
        
        all_data = pd.DataFrame()
        for f in glob.glob("/path/to/directory/*.xlsx"):
            df = pd.read_excel(f)
            all_data = all_data.append(df,ignore_index=True)
        
        all_data.to_csv("new_combined_file.csv")  
        

        【讨论】:

          猜你喜欢
          • 2020-04-22
          • 2021-09-06
          • 2014-01-21
          • 2021-07-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-08-10
          相关资源
          最近更新 更多