Загрузите два файла с разными суффиксами в один фрейм данных - PullRequest
0 голосов
/ 03 мая 2018

У меня есть каталог файлов:

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)

Я не знаю, может ли какая-то модификация этого способа работать с двумя файлами одновременно.

1 Ответ

0 голосов
/ 03 мая 2018

Поместите ваш код в функцию:

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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...