Подсчитать слова и теги появления в каждой строке фрейма данных? - PullRequest
2 голосов
/ 14 июля 2020

У меня есть код, который выполняет тегирование части речи с помощью nltk, а затем я подсчитываю, сколько тегов произошло в каждой строке.

Пример: если у меня есть строковый ввод как:

A = [('car', 'NN'), ('bike', 'NN')]

Я попытался написать свой собственный для l oop, как показано ниже:

def count_tags(input_col):
    tag_count = {}
    for word, tag in input_col:
        if tag in tag_count:
            tag_count[tag] += 1
        else:
            tag_count[tag] = 1
    return(tag_count)

print('tag count is: ', count_tags(hi))

, который выводит то же самое, что:

tag count is:  {'NN': 2}

Вопрос:

У меня есть CSV-файл, который содержит строки в каждой строке, как, например, A пример выше:

print(df['tags'])

0    [('car', 'NN'), ('bike', 'NN')]
1    [('TV', 'NN'), ('access', 'JJ')

и когда я загружаю с помощью panda, а затем пытался подсчитать теги:

df['tag_count'] = df['tags'].map(count_tags)

Я получаю следующую ошибку:

ValueError: not enough values to unpack (expected 2, got 1)

Мой ожидаемый результат:

ID  tags                              count
2   [('car', 'NN'), ('bike', 'NN')]   {'NN': 2}
4   [('TV', 'NN'), ('access', 'JJ')]  {'NN': 1, 'JJ': 1}

1 Ответ

0 голосов
/ 14 июля 2020

Решение

# Using the dataframe df from the Dummy Data section
df2 = (df.tags.explode()
        .explode().groupby(level=0).value_counts()
        .to_frame().rename(columns={'tags': 'count'})
        .reset_index().rename(columns={'tags': 'tag'}) 
)
# Show all tags count
header = lambda s: f'\n{s}\n' + ''.join(['=']*len(s))
print(header('All Tags Count'))
print(df2)

target_tags = ['NN', 'JJ']
# Show target_tags count
result = df2.loc[df3.tag.str.contains('|'.join(target_tags))]
#print("\nTarget Tags Count\n")
print(header('Target Tags Count'))
print(result)

Вывод :

All Tags Count
==============
   ID   tag  count
0   2    NN      2
1   2  bike      1
2   2   car      1
3   4    JJ      1
4   4    NN      1
5   4    TV      1
6   4   pen      1

Target Tags Count
=================
   ID tag  count
0   2  NN      2
3   4  JJ      1
4   4  NN      1

Фиктивные данные

import pandas as pd
df = pd.DataFrame([[2, [('car', 'NN'), ('bike', 'NN')]],
                   [4, [('TV', 'NN'), ('pen', 'JJ')]]], 
                  columns = ['ID', 'tags'])
df.set_index(["ID"], drop=False, inplace=True) # important prerequisite for the solution
print(df)

## Output: df
#
#     ID                     tags
# ID                             
# 2    2  [(car, NN), (bike, NN)]
# 4    4    [(TV, NN), (pen, JJ)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...