从目录中的文件中提取字符串并在Python中将其分配给Dataframe

2024-05-16 09:59:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我在一个名为:

  • 2018财年微软云_测试.xlsm你知道吗
  • 2019财年微软云_测试.xlsm你知道吗
  • FY20云_测试.xlsm你知道吗

它们都有一个叫做“数字”的表,我想把三个文件中的数据合并到一个新的数据框中,我已经用下面的代码完成了。但是,我还想添加两个新列:一个名为“Channel”的列将为所有文件读取“Digital”,另一个名为“financial”的列将为从第一个文件获取的数据读取“FY18”,从第二个文件读取FY19,从第三个文件读取FY20。你知道吗

我有下面的for循环,虽然我设法得到数据合并和通道好,我不能想出一个方法来添加正确的财政对每个数据输入。我通过在第一个下划线前加上字符串,从文件名中提取会计科目的名称。你知道吗

digital_df = pd.DataFrame()
os.chdir(plans_folder)

            for infile in glob.glob(plans_folder + "*Msft Cloud*.xlsm"):
                for fiscal in glob.glob("*Msft Cloud*.xlsm"):
                    data_digital = pd.read_excel(infile, sheetname="Digital", skiprows=9)
                    data_digital.insert(0, "Channel", "Digital")
                    digital_df = digital_df.append(data_digital, ignore_index=True)
                    fiscal = fiscal.split('_', 1)[0]
                    digital_df['Fiscal'] = fiscal

digital_df

有什么想法吗?你知道吗


Tags: 文件数据dffordatachannelglobpd
1条回答
网友
1楼 · 发布于 2024-05-16 09:59:13

您可以使用^{}更容易地从完整的文件路径中获取信息,它会报告文件名(通常是!)。你知道吗

因此您可以执行以下操作(假设您已经导入了os)。注意,您可以简化您的循环—您以前同时执行了infilefiscal,这两个操作实际上返回了相同的文件列表,这意味着您将四个文件中的每一个都获取四次!此外,在合并数据帧之前添加会计年度更容易:

for infile in glob.glob(plans_folder + "*Msft Cloud*.xlsm"):
    data_digital = pd.read_excel(infile, sheetname="Digital", skiprows=9)
    data_digital["Channel"] = "Digital"
    f_year = os.path.basename(infile).split('_')[0]
    data_digital["Fiscal"] = f_year
    digital_df = digital_df.append(data_digital, ignore_index=True)

另外,如果您以这种方式使用os.path.basename(),则不需要更改到目录(使用os.chdir

要将此数据帧写入csv,可以使用数据帧的to_csv()方法:

digital_df.to_csv(os.path.join(plans_folder, 'Summary.csv'), index=False)

这将覆盖任何现有的文件,并且使用os.path.join确保我们最终与这些文件位于同一个文件夹中。你知道吗

相关问题 更多 >