如何将多个项目附加到pandas df?

时间:2018-03-19 00:56:00

标签: python pandas dataframe append

我有数百个excel文件,我想在一列中创建一个具有excel文件名称的df,然后在第二列中创建每个选项卡的名称。我的脚本将遍历每个文件名,但我追加的方式不对,而且我找不到解决方案的运气也不多。

os.chdir(r'C:\Users\mbobak\Documents\\')
FileList = glob.glob('*.xlsx')

tabs= pd.DataFrame(columns=['filename','tabs'])

for filename in FileList:
    xl = pd.ExcelFile(filename).sheet_names
    tabs= tabs.append([filename,xl])

期望的输出:

filename    tabs
doc1.xlsx   tab1
doc1.xlsx   tab2
doc1.xlsx   tab3
doc1.xlsx   tab4
doc2.xlsx   tab1
doc2.xlsx   tab2
doc2.xlsx   tab3

2 个答案:

答案 0 :(得分:4)

这是一种方法。在一个步骤中创建数据框是一种很好的做法,也是有效的。这是因为附加到列表比附加到数据帧要便宜。

FileList = glob.glob('*.xlsx')

def return_files_tabs(FileList):
    for filename in FileList:
        for sheet in pd.ExcelFile(filename).sheet_names:
            yield [filename, sheet]

df = pd.DataFrame(list(return_files_tabs(FileList)),
                  columns=['Filename', 'Tab'])

<强>解释

  • sheet_names属性中循环浏览每个文件和每个工作表。
  • 通过生成器生成文件名和工作表。
  • 从耗尽的生成器列表构建数据框,名称列。

答案 1 :(得分:2)

我喜欢@jpp的答案,但是如果你不想使用发电机,我就是这样做的:

FileList = glob.glob('*.xlsx')

filenames = []
sheets = []

for filename in FileList:
    for sheet in pd.ExcelFile(filename).sheet_names:
        filenames.append(filename)
        sheets.append(sheet)

df = pd.DataFrame(
    {'Filename': filenames, 'Tab': sheets}
)