Конкатенация нескольких фреймов данных - PullRequest
0 голосов
/ 21 октября 2018

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

У меня есть такая функция:

path = os.path.join(os.getcwd(),'C:\\.........')
files = [os.path.join(path,i) for i in os.listdir(path) if os.path.isfile(os.path.join(path,i))]

for file in files:

    openfile = open(file,'r')
    new_line = []

    def separateState(l):
        for line in l:
            if any(x in line for x in ['NEW ENGLAND', 'MIDDLE ATLANTIC', 'E N CENTRAL', 'W N CENTRAL', 'SOUTH ATLANTIC', 'E S CENTRAL', 'W S CENTRAL', 'MOUNTAIN', 'PACIFIC']):     
                new_line.append(line.split())

    separateState(openfile)

    frames = list()

    def join_words(n):
        for listy in n:
            grouper = groupby(listy, key=str.isalpha)
            joins = [[' '.join(v)] if alpha_flag else list(v) for alpha_flag, v in grouper]
            res = list(chain.from_iterable(joins))
            df = pd.DataFrame(res)
            frames.append(df)
        df = pd.concat(frames)
        df['Date'] = os.path.split(file)[-1]
        df.to_csv('temp.csv', header = False)
        print(frames)

    join_words(new_line)

Но это выводит по одному фрейму данных на список, потому что он переопределяет предыдущий фрейм данных.

Как я могу манипулировать этим (я думаю, это простое исправление), чтобы я получил один фрейм данных и файл CSVвыход из этой функции?

Ответы [ 2 ]

0 голосов
/ 21 октября 2018

Рассмотрите возможность перефакторинга вашего кода для организации и читабельности, и, похоже, вам нужно два pd.concat вызова: на уровне новой строки и на уровне текстового файла.

В частности, учитывайте следующее:

  1. Размещать def вызовы вне любого цикла с помощью return.Нет необходимости переопределять одну и ту же функцию итеративно.

  2. Используйте диспетчер контекста with при чтении файлов, чтобы избежать необходимости закрывать после обработки.

  3. Попросите цикл вызвать ваши функции для возврата выходов, которые затем соединяются в конце.

Скорректированный код:

def separateState(txt):
    new_line = []

    with open(txt, 'r') as l:
        for line in l:
            if any(x in line for x in ['NEW ENGLAND', 'MIDDLE ATLANTIC', 
                                       'E N CENTRAL', 'W N CENTRAL', 
                                       'SOUTH ATLANTIC', 'E S CENTRAL', 
                                       'W S CENTRAL', 'MOUNTAIN', 'PACIFIC']):     
                 new_line.append(line.split())

        return new_line

def join_words(n, txt):
    frames = list()

    for listy in n:
        grouper = groupby(listy, key=str.isalpha)
        joins = [[' '.join(v)] if alpha_flag else list(v) for alpha_flag, v in grouper]
        res = list(chain.from_iterable(joins))
        df = pd.DataFrame(res)
        df['Date'] = os.path.split(txt)[-1]
        frames.append(df)

    new_df = pd.concat(frames)
    return new_df


df_list = [] 
for file in files:          
    new_line = separateState(file)
    df = join_words(new_line, file)
    df_list.append(df)

final_df = pd.concat(df_list)
final_df.to_csv('temp.csv', header = False)
print(df_list)
0 голосов
/ 21 октября 2018

Вы хотите сделать что-то вроде этого:

frames = list()

def join_words(n):
    for listy in n:
        res = list(........does things to the lists)
        df = pd.DataFrame(res)
        frames.append(df)
    df = pd.concat(frames)
    df.to_csv('temp.csv', header = False)

Просто накапливайте каждый отдельный кадр во время цикла, а затем объединяйте их все в конце.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...