Создать новый словарь из старого словаря 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'"]
Другие вопросы по тегам