Анализ данных токена из кадра данных Pandas

Я относительный новичок в Python, а также новичок в обработке естественного языка (NLP).

У меня есть фрейм данных, содержащий имена и продажи. Я хочу: 1) выделить все токены и 2) объединить продажи по каждому токену.

Вот пример фрейма данных:

name    sales
Mike Smith  5
Mike Jones  3
Mary Jane   4

Вот желаемый результат:

token   sales
mike    8
mary    4
Smith   5
Jones   3
Jane    4

Мысли, что делать? Я использую Python.

У вас уже есть любимый токенизатор? Будут ли имена всегда firstname lastname?

Asish M. 24.12.2020 20:54

На самом деле, это не всегда будет имя и фамилия. Существует бесконечное количество токенов, поэтому код должен динамически обрабатывать различное количество токенов. и спасибо за помощь.

nia4life 25.12.2020 19:28
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
960
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы можете использовать метод str.split() и сохранить элемент 0 для имени, используя его в качестве группового ключа и взять сумму, затем сделать то же самое для элемента -1 (фамилия) и объединить их.

import pandas as pd
df = pd.DataFrame({'name': {0: 'Mike Smith', 1: 'Mike Jones', 2: 'Mary Jane'},
 'sales': {0: 5, 1: 3, 2: 4}})


df = pd.concat([df.groupby(df.name.str.split().str[0]).sum(),
    df.groupby(df.name.str.split().str[-1]).sum()]).reset_index()

df.rename(columns = {'name':'token'}, inplace=True)
df[["fname", "lname"]] = df["name"].str.split(expand=True) # getting tokens,considering separated by space

tokens_df = pd.concat([df[['fname', 'sales']].rename(columns = {'fname': 'tokens'}),
                       df[['lname', 'sales']].rename(columns = {'lname': 'tokens'})])

pd.DataFrame(tokens_df.groupby('tokens')['sales'].apply(sum), columns=['sales'])

Ответ принят как подходящий

Предположение: у вас есть функция tokenize, которая принимает строку в качестве входных данных и возвращает список токенов.

Сейчас я буду использовать эту функцию в качестве токенизатора:

def tokenize(word):
    return word.casefold().split()

Решение

df.assign(tokens=df['name'].apply(tokenize)).explode('tokens').groupby('tokens')['sales'].sum().reset_index()

In [45]: df
Out[45]:
             name  sales
0      Mike Smith      5
1      Mike Jones      3
2       Mary Jane      4
3  Mary Anne Jane      1

In [46]: df.assign(tokens=df['name'].apply(tokenize)).explode('tokens').groupby('tokens')['sales'].sum().reset_index()
Out[46]:
  tokens  sales
0   anne      1
1   jane      5
2  jones      3
3   mary      5
4   mike      8
5  smith      5

Объяснение

  1. Шаг назначения создает столбец с именем tokens, который применяет функцию tokenize

Примечание. Для этой конкретной функции tokenize вы можете использовать df['name'].str.lower().str.split(), однако это не будет распространяться на пользовательские токенизаторы, поэтому .apply(tokenize)

это генерирует df, который выглядит как

             name  sales              tokens
0      Mike Smith      5       [mike, smith]
1      Mike Jones      3       [mike, jones]
2       Mary Jane      4        [mary, jane]
3  Mary Anne Jane      1  [mary, anne, jane]
  1. используйте df.explode на этом, чтобы получить
             name  sales tokens
0      Mike Smith      5   mike
0      Mike Smith      5  smith
1      Mike Jones      3   mike
1      Mike Jones      3  jones
2       Mary Jane      4   mary
2       Mary Jane      4   jane
3  Mary Anne Jane      1   mary
3  Mary Anne Jane      1   anne
3  Mary Anne Jane      1   jane
  1. последний шаг - это просто шаг groupy-agg.

Спасибо. Можете ли вы разместить весь код в одном месте? Мне трудно понять примеры кода, когда они разбиты.

nia4life 27.12.2020 16:38

это там в первой половине: df.assign(tokens=df['name'].apply(tokenize)).explode('tokens‌​').groupby('tokens')‌​['sales'].sum().rese‌​t_index()

Asish M. 27.12.2020 16:40

Спасибо. Я не понимаю, куда идет функция tokenize.

nia4life 27.12.2020 16:51
tokenize — это просто функция-заполнитель, которая принимает строку и возвращает список токенов. Я использовал очень простой, который просто строчные буквы и разбивается на пробелы. Есть много других токенизаторов слов. nltk имеет word_tokenize например.
Asish M. 27.12.2020 17:02

Другие вопросы по теме