我有一个文件目录:
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.bed
和dog_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)
我不知道是否是一次对两个文件进行一些修改的方法。
把你的代码放在一个函数中:
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()}
现在,您可以在字典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))