добавление нескольких панд DataFrames, считанных из файлов - PullRequest
0 голосов
/ 02 июня 2018

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

import pandas as pd
import numpy as np
from lxml import etree
import os

topics = pd.DataFrame()
for filename in os.listdir('./topics'):
    if not filename.startswith('.'):
        #print(filename)
        tree = etree.parse('./topics/'+filename)
        root = tree.getroot() 
        childA = []
        elementT = []
        ElementA = []
        for child in root:
            elementT.append(str(child.tag))
            ElementA.append(str(child.attrib))
            childA.append(str(child.attrib))
            for element in child:
                elementT.append(str(element.tag))
                #childA.append(child.attrib)
                ElementA.append(str(element.attrib))
                childA.append(str(child.attrib))
                for sub in element:
                    #print('***', child.attrib , ':' , element.tag, ':' , element.attrib, '***')
                    #childA.append(child.attrib)
                    elementT.append(str(sub.tag))
                    ElementA.append(str(sub.attrib))
                    childA.append(str(child.attrib))

        df = pd.DataFrame()
        df['c'] = np.array (childA)
        df['t'] = np.array(ElementA)
        df['a'] = np.array(elementT)

        file = df['t'].str.extract(r'([A-Z][A-Z].*[words.xml])#')
        start = df['t'].str.extract(r'words([0-9]+)')
        stop = df['t'].str.extract(r'.*words([0-9]+)')
        tags = df['a'].str.extract(r'.*([topic]|[pointer]|[child])')
        rootTopic = df['c'].str.extract(r'rdhillon.(\d+)')
        df['f'] = file
        df['start'] = start
        df['stop'] = stop
        df['tags'] = tags
        # c= topic
        # r = pointerr
        # d= child
        df['topicID'] = rootTopic

        df = df.iloc[:,3:]
        topics.append(df)

Однако, когда я вызываю темы, я получаю следующий вывод

topics
Out[19]:_

Может кто-нибудь, пожалуйста, сообщите мне, где я иду не так, также любые предложенияпо улучшению моего грязного кода будет принята

1 Ответ

0 голосов
/ 02 июня 2018

В отличие от списков, при добавлении к DataFrame вы возвращаете новый объект.Таким образом, topics.append(df) возвращает объект, который вы нигде не храните, а topics остается пустым DataFrame, который вы объявляете в 6-й строке.Вы можете исправить это с помощью

topics = topics.append(df)

Однако добавление к DataFrame в цикле является очень дорогостоящим упражнением.Вместо этого вы должны добавить каждый DataFrame в список внутри цикла и вызвать pd.concat() в списке DataFrame s после цикла.

import pandas as pd

topics_list = []
for filename in os.listdir('./topics'):
    # All of your code
    topics_list.append(df) # Lists are modified with append

# After the loop one call to concat
topics = pd.concat(topics_list)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...