Объединить файлы с похожим именем в один фрейм данных - PullRequest
0 голосов
/ 02 ноября 2018

У меня есть список файлов, хранящихся в каталоге, таких как

filenames=[
        abc_1.txt
        abc_2.txt
        abc_3.txt

        bcd_1.txt
        bcd_2.txt
        bcd_3.txt
       ]

pattern=[abc]

Я хочу прочитать несколько текстовых файлов в одном кадре данных, чтобы все файлы, начиная с abc, были в одном кадре, а затем все имена файлов, начиная с bcd и т. Д.

Мой код:

filenames = os.listdir(file_path)
expnames=[]
for files in filenames:
     expnames.append(files.rsplit('_',1)[0])

##   expnames=[abc, bcd]

 dfs = []
 for exp in expnames:
      for files in filenames:
          if files.startswith(exp):
               dfs.append(pd.read_csv(file_path+files,sep=',',header=None))
  big_frame = pd.concat(dfs, ignore_index=True)

Мой вывод содержит повторяющиеся строки из-за нескольких циклов for

Выход: enter image description here

Может ли кто-нибудь помочь с этим?

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018
file_path = '/home/iolie/Downloads/test/'
filenames = os.listdir(file_path)
prefixes = list(set(i.split('_')[0] for i in filenames))


for prefix in prefixes:
    for file in filenames: 
        if file.startswith(prefix):
            list_of_dfs= [ pd.concat( [pd.read_csv (os.path.join(file_path, file)], header=None ),ignore_index=True)]
            final=pd.concat(list_of_dfs)
0 голосов
/ 02 ноября 2018

Это сохранит ваши желаемые выходные данные в списке фреймов данных, называемых list_of_dfs, а затем создаст из них MultiIndex dataframe final с префиксами файлов (например, ['abc','bcd']) в качестве ключей для внешнего уровня индекса:

import pandas as pd
import os

filenames = os.listdir(file_path)

prefixes = list(set(i.split('_')[0] for i in filenames))

list_of_dfs = [pd.concat([pd.read_csv(os.path.join(file_path, file), header=None) for file in filenames if file.startswith(prefix)], ignore_index=True) for prefix in prefixes]

final = pd.concat(list_of_dfs, keys=prefixes)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...