Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从目录中的文件中提取字符串,并在Python中将其分配给Dataframe_Python_Pandas_For Loop - Fatal编程技术网

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

从目录中的文件中提取字符串,并在Python中将其分配给Dataframe,python,pandas,for-loop,Python,Pandas,For Loop,我在一个名为: 2018财年Msft云测试.xlsm FY19_Msft Cloud_test.xlsm FY20\u Msft Cloud\u test.xlsm 它们都有一个名为Digital的工作表,我想将这三个文件中的数据合并到一个新的数据框中,我已经用下面的代码完成了。但是,我还想添加两个新列:一个名为Channel的列将读取所有文件的数字数据,另一个名为Financial的列将读取从第一个文件获取的FY18数据,从第二个文件读取FY19数据,从第三个文件读取FY20数据 我有下面的f

我在一个名为:

2018财年Msft云测试.xlsm FY19_Msft Cloud_test.xlsm FY20\u Msft Cloud\u test.xlsm 它们都有一个名为Digital的工作表,我想将这三个文件中的数据合并到一个新的数据框中,我已经用下面的代码完成了。但是,我还想添加两个新列:一个名为Channel的列将读取所有文件的数字数据,另一个名为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
有什么想法吗?

您可以使用它来更轻松地获取信息-从完整的文件路径,这通常会报告文件名

因此,假设您已经导入了操作系统,您可以执行以下操作。请注意,您可以简化您的循环-您以前同时执行了infle和fiscal,它们实际上返回了相同的文件列表,这意味着您;我要把这四个文件各取四次!此外,在合并数据帧之前添加会计年度要容易得多:

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可确保我们最终与文件位于同一文件夹中。

谢谢您的帮助!然而,由于一些奇怪的原因,现在它将数据增加了四倍,因此每个财政年度的数据都会重复四次……您可以在glob.globplans_文件夹+*Msft Cloud*.xlsm和glob.glob*Msft Cloud*.xlsm中循环填充数据-您应该这样做。我将编辑它,使其逐渐失效。2018财年重复7次,2019财年重复7次。。。出于某些原因,财政预算也有~$FY18作为一个选项,但如果需要,我可以过滤掉。是否有额外的文件添加到您的文件夹中,可能是从以前的运行中添加的?请注意,glob将返回所有与命名约定匹配的文件。啊,我知道问题出在哪里了,每次我再次运行该程序时,它都会将相同的数据复制到上一个数据帧的顶部-因此为什么会重复。仍然不知道2018财年的~$FY18从何而来。太棒了,非常感谢!