【问题标题】:How to append multiple items to pandas df?如何将多个项目附加到熊猫df?
【发布时间】:2018-08-27 12:09:57
【问题描述】:

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

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

【问题讨论】:

  • 在最后一行尝试:tabs.append(pd.DataFrame([filename,xl], columns=['filename','tabs']))
  • 通常最好先将数据组装成列表或字典,然后在最后创建完整的 DataFrame。我认为,如果您反复附加到数据帧,则必须大量移动内存中的内容。

标签: python pandas dataframe append


【解决方案1】:

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

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 属性内的每个文件和每个工作表。
  • 通过生成器生成文件名和工作表。
  • 从已用尽的生成器列表、名称列构建数据框。

【讨论】:

  • 这是个好建议。谢谢。我使用这种方法收到错误TypeError: 'function' object is not iterable
【解决方案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}
)

【讨论】:

    猜你喜欢
    • 2021-12-22
    • 2021-08-18
    • 2016-01-25
    • 2015-06-16
    • 2021-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多