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

问题描述 投票:-1回答:1

我有一个文件目录:

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(例如dog.csv)。

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

path = r'C:\\data\\'              
all_files = glob.glob(os.path.join(path, "*.bed")) 

df_from_each_file = (pd.read_csv(f, sep='\t') for f in all_files)
dfall = pd.concat(df_from_each_file, ignore_index=True)

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

python pandas dataframe
1个回答
2
投票

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

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']}

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

dfs = {name: read_two(files) for name, files in byname.items()}

现在,您可以访问dict dfs中的数据框:

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

像这样:

dogdf = dfs['dog']

或者循环处理:

for name, df in dfs.items():
     merged = df.merge(animals, on=['col'])
     merged.to_csv('{}.csv'.format(name))
© www.soinside.com 2019 - 2024. All rights reserved.