【问题标题】:Reading multiple excel files into a pandas dataframe, but also storing the file name将多个 excel 文件读入 pandas 数据框,同时也存储文件名
【发布时间】:2021-10-25 02:04:47
【问题描述】:

我想读取多个 excel 文件并将它们存储到一个 pandas 数据框中,但我希望数据框中的一列是文件名。这是因为文件名包含日期(这是每月数据),我需要该信息。我似乎无法获得文件名,但我能够将 excel 文件放入数据框中。请帮忙。

import os
import pandas as pd
import fsspec

files = os.listdir("C://Users//6J2754897//Downloads//monthlydata")
paths = "C://Users//6J2754897//Downloads//monthlydata"

a = pd.DataFrame([2], index = None)

df = pd.DataFrame()
for file in range(len(files)):
   if files[file].endswith('.xlsx'): 
      df = df.append(pd.read_excel(paths + "//" + files[file], sheet_name = "information", skiprows=7), ignore_index=True)
      df['Month'] = str(files[file])

【问题讨论】:

    标签: excel pandas dataframe


    【解决方案1】:

    这里的操作顺序不正确。行:

    df['Month'] = str(files[file])
    

    要用最新的值覆盖整个列。

    相反,我们应该只将值添加到 current DataFrame:

    import os
    
    import pandas as pd
    
    paths = "C://Users//6J2754897//Downloads//monthlydata"
    files = os.listdir(paths)
    
    df = pd.DataFrame()
    for file in range(len(files)):
        if files[file].endswith('.xlsx'):
            # Read in File
            file_df = pd.read_excel(paths + "//" + files[file],
                                    sheet_name="information",
                                    skiprows=7)
            # Add to just this DataFrame
            file_df['Month'] = str(files[file])
            # Update `df`
            df = df.append(file_df, ignore_index=True)
    

    或者,我们可以使用DataFrame.assign 链接列分配:

    import os
    
    import pandas as pd
    
    paths = "C://Users//6J2754897//Downloads//monthlydata"
    files = os.listdir(paths)
    
    df = pd.DataFrame()
    for file in range(len(files)):
        if files[file].endswith('.xlsx'):
            # Read in File
            df = df.append(
                # Read in File
                pd.read_excel(paths + "//" + files[file],
                              sheet_name="information",
                              skiprows=7)
                    .assign(Month=str(files[file])),  # Add to just this DataFrame
                ignore_index=True
            )
    

    对于一般的整体改进,我们可以使用pd.concat 对文件进行列表理解。这样做是为了避免增长 DataFrame(这可能非常慢)。 Pathlib.glob 还可以帮助您选择合适的文件:

    from pathlib import Path
    
    import pandas as pd
    
    paths = "C://Users//6J2754897//Downloads//monthlydata"
    
    df = pd.concat([
        pd.read_excel(file,
                      sheet_name="information",
                      skiprows=7)
            .assign(Month=file.stem)  # We may also want file.name here
        for file in Path(paths).glob('*.xlsx')
    ])
    

    月份列的一些选项是:

    • file.stem 将给出“[t]he final path component, without its suffix”。
      • “文件夹/文件夹/sample.xlsx”->“样本”
    • file.name 将给出“最终路径组件,不包括驱动器和根目录”。
      • '文件夹/文件夹/sample.xlsx' -> 'sample.xlsx'

    【讨论】:

    • 一切都很好,但我想知道“.assign”方法为什么不只是像我以前错误地那样用最新值覆盖整个列?这只是assign方法的本质吗?
    • 所以问题是你有 1 个 DataFrame df。每次循环时,您都会用新值覆盖 整个 列。因此,您只会在该列中拥有最新的文件。分段执行(通过仅将值添加到您刚刚读入的 DataFrame)然后附加到 df 意味着您永远不会覆盖以前的信息。
    猜你喜欢
    • 1970-01-01
    • 2021-01-13
    • 2019-11-25
    • 1970-01-01
    • 2021-09-06
    • 2019-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多