将具有不同后缀的两个文件加载到一个数据帧中

时间:2018-05-03 17:34:47

标签: python pandas dataframe

我有一个文件目录:

dog_A_final.bed
dog_B_final.bed
bird_A_final.bed
bird_B_final.bed
cat_A_final.bed
cat_B_final.bed

我想一次只添加两个文件到df,基于它们的前缀 - 所以dog_A_final.beddog_B_final.bed会进入一个df。

该目录有数百个文件,因此我想加载它们,然后自动运行合并(使用另一个数据集),并自动输出prefix.csv(例如{{1} }})。

我知道我可以使用以下方法将所有这些文件添加到一个数据框中:

dog.csv

我不知道是否有一些修改是一次两个文件的方式。

1 个答案:

答案 0 :(得分:2)

将您的代码放在一个函数中:

    def __merge(self, json_dir_path):
    if os.path.exists(json_dir_path):
        filelist = [f for f in os.listdir( json_dir_path )]

        df_output = pd.DataFrame()
        for json_fn in filelist:
            json_full_name = os.path.join( json_dir_path, json_fn )
            # print("[TrainficationWorkflow::__merge] We are merging the json file ", json_full_name)
            if os.path.exists(json_full_name):
                with open(json_full_name, 'r') as in_json_file:
                    json_data = json.load(in_json_file)
                    input_fn = json_data["accPreparedCSVFileName"]
                    df_i = pd.read_csv(input_fn)
                    df_output = df_i.append(df_output)
        return df_output
    else:
        return pd.DataFrame(data=[], columns=self.DATA_FORMAT)

您可以通过前缀

订购名称
def read_two(files):
    df_from_each_file = (pd.read_csv(f, sep='\t') for f in files)
    return pd.concat(df_from_each_file, ignore_index=True)

现在import os byname = {} for name in all_files: short_name = os.path.split(name)[-1] byname.setdefault(short_name.split('_', 1)[0], []).append(name) 看起来像这样:

byname

现在,通过前缀将所有数据帧放在字典中:

{'bird': ['bird_A_final.bed', 'bird_B_final.bed'],
 'cat': ['cat_A_final.bed', 'cat_B_final.bed'],
 'dog': ['dog_A_final.bed', 'dog_B_final.bed']}

现在,您可以访问dict dfs = {name: read_two(files) for name, files in byname.items()} 中的数据框:

dfs
像这样:

{'bird': <bird_df>,
 'cat': <cat_df>,
 'dog': <dog_df>}

或循环处理:

dogdf = dfs['dog']