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

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

df:

ID    title    cur_working    pos_arg         neg_arg                             date
132   leave    yes            good coffee     management, leadership and salary   13-04-2018
145   love it  yes            nice colleagues long days                           14-04-2018

У меня есть следующий код:

result = entity_analysis(df, 'neg_arg', 'ID')

#This code loops through the rows and calls the function entities_text()
def entity_analysis(df, col, idcol):
    temp_dict = {}
    for index, row in df.iterrows():
        id = (row[idcol])
        x = (row[col])
        entities = entities_text(x, id)
        #temp_dict.append(entities)
    #final = pd.DataFrame(columns = ['id', 'name', 'type', 'salience'])
    return print(entities)

def entities_text(text, id):
    """Detects entities in the text."""
    client = language.LanguageServiceClient()
    ent_df = {}
    if isinstance(text, six.binary_type):
        text = text.decode('utf-8')

    # Instantiates a plain text document.
    document = types.Document(
        content=text,
        type=enums.Document.Type.PLAIN_TEXT)

    # Detects entities in the document.
    entities = client.analyze_entities(document).entities

    # entity types from enums.Entity.Type
    entity_type = ('UNKNOWN', 'PERSON', 'LOCATION', 'ORGANIZATION',
                   'EVENT', 'WORK_OF_ART', 'CONSUMER_GOOD', 'OTHER')

    for entity in entities:
        ent_df[id] = ({
            'name': [entity.name],
            'type': [entity_type[entity.type]],
            'salience': [entity.salience]
        })
    return print(ent_df)

Этот код дает следующий результат:

{'132': {'name': ['management'], 'type': ['OTHER'], 'salience': [0.16079013049602509]}}
{'132': {'name': ['leadership'], 'type': ['OTHER'], 'salience': [0.05074194446206093]}}
{'132': {'name': ['salary'], 'type': ['OTHER'], 'salience': [0.27505040168762207]}}
{'145': {'name': ['days'], 'type': ['OTHER'], 'salience': [0.004272154998034239]}}

Я создал temp_dict и final фрейм данных в функции entity_analysis(). Этот поток объяснил, что добавление к циклу данных в цикле неэффективно. Я не знаю, как эффективно заполнить фрейм данных . Эти потоков связаны с моим вопросом, но они объясняют, как заполнять Dataframe из существующих данных.Когда я пытаюсь использовать temp_dict.update(entities) и возвращать temp_dict, я получаю ошибку:

в entity_analysis temp_dict.update (entity) TypeError: объект 'NoneType' не повторяется

Я хочу, чтобы вывод был таким:

ID          name                  type                salience
132         management            OTHER               0.16079013049602509 
132         leadership            OTHER               0.05074194446206093 
132         salary                OTHER               0.27505040168762207 
145         days                  OTHER               0.004272154998034239 

1 Ответ

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

Одним из решений является создание списка списков с помощью итерации entities.Затем введите список списков в pd.DataFrame:

LoL = []

for entity in entities:
    LoL.append([id, entity.name, entity_type[entity.type], entity.salience])

df = pd.DataFrame(LoL, columns=['ID', 'name', 'type', 'salience'])

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

...