将多个Excel文件导入Python Pandas并将它们连接成一个数据框。

45

我想从一个目录中读取多个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)

1
你在另一个问题中的代码已经很好了,只需要将read_csv替换为read_excel即可。 - joris
1
你的代码并不是完全正确的(在另一个问题中是这样的)。你不能循环遍历你刚刚创建的空列表dfs,所以应该循环遍历文件名,然后在循环中使用dfs.append(df),之后再使用pd.concat(dfs, ignore_index=True) - joris
你能帮我修改一下代码吗?因为我是 Python 的初学者。 - jonas
请看一下您的另一个问题。 - joris
好的,谢谢,现在它可以工作了!!! - jonas
8个回答

101

正如评论中提到的那样,你犯了一个错误,即正在对一个空列表进行循环。

以下是我如何做到这一点的示例,使用有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

4
这样做当然可以,但我认为在几乎相同的问题 https://dev59.com/QmEi5IYBdhLWcg3w2POB 中使用添加到列表,然后 pd.concat(the_list) 的方法更加简洁。 - joris
谢谢。我确实能理解这个。但是为什么语句中要用到 f[-3:]:files_xls = [f for f in files if f[-3:] == 'xls'] - jonas
1
很高兴能帮忙!大约6个月前,我也在学习Pandas时和你处于同样的位置,所以我很高兴能提供任何帮助。f[-3:] 是我解析每个字符串。files列表本质上是一个字符串列表。因此,在列表推导式中,我要求文件(即字符串)的扩展名,即最后3个字符,为“xls”。 - ericmjl
我来晚了,但是我在这个案例中有一个小疑问。如果这些Excel文件中有多个工作表怎么办?如何将它们一起导入? - Manas Jani
发布一个新问题,引用这个SO问题,让我们看看社区能为您提供什么帮助 :) - ericmjl
显示剩余4条评论

6

这个适用于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()    

6
有一种更简便的方法来完成这个任务。
# import libraries
import glob
import pandas as pd

# get the absolute path of all Excel files 
allExcelFiles = glob.glob("/path/to/Excel/files/*.xlsx")

# read all Excel files at once
df = pd.concat(pd.read_excel(excelFile) for excelFile in allExcelFiles)

5

你可以在 concat 中使用列表推导式:

import os
import pandas as pd

path = '/path/to/directory/'
filenames = [file for file in os.listdir(path) if file.endswith('.xlsx')]

df = pd.concat([pd.read_excel(path + file) for file in filenames], ignore_index=True)

使用 ignore_index = Truedf 的索引将被标记为 0, …, n - 1


1

#快捷方式

import pandas as pd 
from glob import glob

dfs=[]
for f in glob("data/*.xlsx"):
    dfs.append(pd.read_excel(f))
df=pd.concat(dfs, ignore_index=True)

1
这可以用以下方式完成:
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")  

-1
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

-1
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文件,也可以从本地路径中读取。使用迭代将它们放入空数据框中,然后将数据框连接起来。我还将所有月份的数据导出到另一个CSV文件中。


1
希望这可以解决问题,但请附上代码的解释,以便用户真正理解他/她想要的内容。 - Jaimil Patel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接