Создать новый словарь из старого словаря Pandas DataFrame для расчета энтропии
Я начинаю ладить с пандами, но не знаю, как решить эту проблему.
У меня есть столбец словарей в кадре данных панд, для которого я пытаюсь вычислить энтропию.
Каждый ключ в словаре обозначает кластер, а значения - это слова в одном кластере. Каждая строка выглядит следующим образом, с разным количеством элементов в словаре. Т.е. у некоторых словарей есть два кластера, а у некоторых до 10:
{1: ["'stop'", "'avoid'", "'stifle'", "'not'", "'squelch'", "'contain'", "'cover'", "'suppress'"], 2: ["'hold'"], 3: ["'burke'"], 4: ["'hod'"]}
Я хочу рассчитать энтропию каждой строки, но хочу, чтобы значения в каждом кластере были одинаковыми. Например, в идеале приведенный выше пример должен выглядеть примерно так:
{1: ["'stop'", "'stop'", "'stop'", "'stop'", "'stop'", "'stop'", "'stop'", "'stop'"], 2: ["'hold'"], 3: ["'burke'"], 4: ["'hod'"]}
И, наконец, я надеюсь взять каждое значение из кластеров, затем объединить их в один список, который будет выглядеть следующим образом, чтобы я мог использовать для этого свою формулу энтропии:
["'stop'", "'stop'", "'stop'", "'stop'", "'stop'", "'stop'", "'stop'", "'stop'", "'hold'", "'burke'", "'hod'"]
Я изо всех сил пытаюсь найти способ использовать панды или более простой Python для создания новых словарей с кластерами, которые похожи на мой второй пример, а затем превращать эти значения в список, как мой третий пример.
1 ответ
Непонятно, как вычисление энтропии вписывается в указанные вами входные и выходные данные, но вот один из способов получить желаемый результат, используя смесь панд и базового Python.
import pandas as pd
data = {1: ["'stop'", "'avoid'", "'stifle'", "'not'", "'squelch'",
"'contain'", "'cover'", "'suppress'"],
2: ["'hold'"],
3: ["'burke'"],
4: ["'hod'"]}
s = pd.Series(data)
s
1 ['stop', 'avoid', 'stifle', 'not', 'squelch', ...
2 ['hold']
3 ['burke']
4 ['hod']
dtype: object
Возьмите первый элемент каждого списка и добавьте пробел для последующего разделения:
s2 = s.apply(lambda x: (x[0]+" ")*len(x))
s2
1 'stop' 'stop' 'stop' 'stop' 'stop' 'stop' 'sto...
2 'hold'
3 'burke'
4 'hod'
dtype: object
Теперь вытащите каждый элемент в каждой строке и объедините в один список:
slist = []
for valset in s2:
# strip the trailing space in each valset
for val in valset.strip().split(" "):
slist.extend([val])
slist
["'stop'", "'stop'", "'stop'", "'stop'", "'stop'", "'stop'",
"'stop'", "'stop'", "'hold'", "'burke'", "'hod'"]