#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:
Я бы сделал три операции.
- Создайте новый столбец с преобразованными значениями столбца «profile_values» в фактический список с:
df['new_column'] = [eval(x) for x in df['profile_values']
- Создайте список за пределами фрейма данных, содержащий все слова в одном списке:
single_list = [x for y in df['new_column'] for x in y]
- Используйте функцию для подсчета частот списков, например:
import collections counter = collections.Counter(single_list)
Затем у вас есть частоты для каждого слова в списке.