Совокупные уникальные слова в огромном фрейме данных

Как получить кумулятивные уникальные слова из столбца фрейма данных, в котором содержится более 500 слов на каждый. Dataframe имеет ~ 300 000 строк

Я прочитал файл csv в фрейме данных со столбцом A, имеющим текстовые данные. Я попытался создать пару столбцов (B & C), прокручивая столбец A и беря уникальные слова из столбца A как набор и добавляя столбец B с уникальными словами и столбец C с количеством

Впоследствии я беру уникальные слова, взяв столбец A и столбец B (объединение) из предыдущей строки (набора).

Это работает для небольшого количества строк. Но как только количество строк превышает 10 000, производительность снижается, и ядро ​​​​в конце концов умирает.

Есть ли лучший способ сделать это для огромного фрейма данных?

Пытался создать отдельный фрейм данных только с уникальными словами и количеством, но все еще есть проблема

Образец кода:

for index, row in DF.iterrows():
      if index = 0:
          result = set(row['Column A'].lower().split()
          DF.at[index, 'Column B'] = result
      else:
          result = set(row['Column A'].lower().split()
          DF.at[index, 'Cloumn B'] = result.union(DF.loc[index -1, 
                                                'Column B'])
DF['Column C'] = DF['Column B'].apply(len)

выложи свой код, не описывай его. Также опубликуйте минимальный, полный и проверяемый пример

CAPSLOCK 08.04.2019 16:04

Извините, разместил код

MLNLPEnhusiast 08.04.2019 16:15

Итак, вам нужны только все уникальные значения «столбца» из фрейма данных?

Yash Nag 08.04.2019 16:31

Совокупное уникальное значение из столбца A и совокупное количество уникальных слов из столбца A

MLNLPEnhusiast 08.04.2019 16:48
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
4
616
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете использовать CountVectorizer и впоследствии сделать кумулятивную сумму.

Узнайте больше о CountVectorizer: https://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.CountVectorizer.html И совокупная сумма панд: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.cumsum.html

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

MLNLPEnhusiast 08.04.2019 17:32

Не могли бы вы предоставить образец данных для проверки вашего кода?

Brice 08.04.2019 17:41
Ответ принят как подходящий

Используйте уникальность ключей словаря для накопления слов.

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

Код:

cumulative_words = {}

def cumulate(x):
    cumulative_words.update(dict.fromkeys(set(x.lower().split())))
    return list(cumulative_words.keys())

df["Column B"] = df["Column A"].apply(cumulate)
df["Column C"] = df["Column B"].apply(len)

Обновлять:

Учитывая, что вы сказали, что этот код все еще имеет проблемы с памятью при ~ 200 тыс. строк, Я попробую что-то очень простое, чтобы понять немного больше:

  1. Просто обновите словарь кумулятивов

Создайте словарь с уникальными словами перед операциями с кадрами данных

cumulative_words = {}

for x in df["Column A"].values:
    cumulative_words.update(dict.fromkeys(set(x.lower().split())))

Если это все еще ломается, я думаю, нам нужно изменить метод

  1. Добавить слова в список

Я думаю, что это критическая точка, потому что она создает список из списков примерно из миллиардов слов.

cumulative_words = {}
cumulative_column = []

for x in df["Column A"].values:
    cumulative_words.update(dict.fromkeys(set(x.lower().split())))
    cumulative_column.append(cumulative_words.keys())
  1. Назначьте созданный список столбцу B и подсчитайте
df["Column B"] = cumulative_column
df["Column C"] = df["Column B"].apply(len)

Может быть, слишком много слов для хранения, и фрейм данных не может быть создан, или я не знаю, как это сделать. Дайте мне знать

Решение от Lante дало лучший результат, чем мои предыдущие попытки. Не идеально, так как он все еще ломается на ~ 200 тыс. строк.

MLNLPEnhusiast 10.04.2019 23:10

Рад, что вы оценили мой вариант, но мне любопытно, что произойдет, когда он сломается?

Lante Dellarovere 10.04.2019 23:24

Либо ядро ​​умирает, либо ошибка памяти при работе в ноутбуке Jupyter

MLNLPEnhusiast 11.04.2019 01:15

Я добавил пару вещей, которые я бы сделал

Lante Dellarovere 11.04.2019 12:32

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