Как очистить или преобразовать эти значения данных, чтобы получить распределение количества слов?

#python #pandas #jupyter

Вопрос:

У меня есть фрейм данных pandas со столбцом типа объекта, который имеет значения профилирования для каждого пользователя, как это:

 print(df[profile_values]) 
   
1    [n "ab",n "abc",n "abcd"n]
1    NaN
3    [n "ab",n "abcd"n]
4    NaN
5    [n "ab"n]
...
 

Нужно обрезать значения или изменить тип данных, чтобы я мог считать слова, чтобы найти распределение указанных слов. Вот так:

 word    count
ab      3
abc     1
abcd    2
...
 

Есть какие-нибудь советы?

ИЗМЕНИТЬ: Значения имеют строковый тип

Комментарии:

1. каков тип python значений ваших столбцов? Это строка? -> > [n "ab",n "abc",n "abcd"n] или список?

2. ДА. это строковые значения

Ответ №1:

если ваш фрейм данных выглядит примерно так:

 df = pd.DataFrame(['[n "ab",n "abc",n "abcd"n]', np.nan, '[n "ab",n"abcd"n]', np.nan, '[n "ab"n]'], columns=["profile_values"])
 

Есть несколько шагов. Преобразуйте литералы в списки строк, explode преобразуйте серию списков в одну серию, а затем подсчитайте повторяющиеся значения:

 from ast import literal_eval
counts = df.dropna()["profile_values"].apply(literal_eval).explode().value_counts()
 

выход:

 ab      3
abcd    2
abc     1
Name: profile_values, dtype: int64
 

Комментарии:

1. Это сработало как заклинание 🙂 Никогда не слышал об этом матоде. Спасибо.

Ответ №2:

Я бы сделал три операции.

  1. Создайте новый столбец с преобразованными значениями столбца «profile_values» в фактический список с:
     df['new_column'] = [eval(x) for x in df['profile_values']
     
  2. Создайте список за пределами фрейма данных, содержащий все слова в одном списке:
     single_list = [x for y in df['new_column'] for x in y]
     
  3. Используйте функцию для подсчета частот списков, например:
     import collections
    counter = collections.Counter(single_list)
     

Затем у вас есть частоты для каждого слова в списке.