Python 从旧字典数据帧创建新字典以计算熵

Python 从旧字典数据帧创建新字典以计算熵,python,pandas,dataframe,scipy,entropy,Python,Pandas,Dataframe,Scipy,Entropy,我开始对熊猫感到满意,但我不确定如何解决这个问题 我在熊猫数据框中有一列字典,我正试图计算它们的熵 字典中的每个键表示一个簇,值是同一簇中的单词。每一行看起来像这样,字典中的元素数量不同。也就是说,有些词典有两个簇,而有些词典最多有10个簇: {1: ["'stop'", "'avoid'", "'stifle'", "'not'", "'squelch'", "'contain'", "'cover'", "'suppress'"], 2: ["'hold'"], 3: ["'burke'

我开始对熊猫感到满意,但我不确定如何解决这个问题

我在熊猫数据框中有一列字典,我正试图计算它们的熵

字典中的每个键表示一个簇,值是同一簇中的单词。每一行看起来像这样,字典中的元素数量不同。也就是说,有些词典有两个簇,而有些词典最多有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'"]

我正在努力寻找一种方法,使用pandas或更基本的python创建新的字典,其中包含类似于第二个示例的集群,然后将这些值转换为类似于第三个示例的列表。

不清楚熵计算如何适合指定的输入和输出,但这里有一种方法可以获得所需的输出,混合使用Pandas和基本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'"]

为什么第一本字典中对应于1的列表在第二本字典中变成了“停止”?