如何从熊猫数据框中计算信息的香农熵?

时间:2018-11-06 17:51:48

标签: python pandas entropy

我有一个数据框df,其中包含从单个Name_Give到另一个Name_Receive的交易信息,如下所示:

df
    Name_Give    Name_Receive   Amount
0    John           Tom          300
1    Eva            Tom          700
2    Sarah          Tom          100
3    John           Tom          200
4    Tom            Eva          700
5    John           Eva          300
6    Carl           Eva          250

对于每个Name_Receive j,我想将Shannon熵计算为S_j = -sum_i p_i \log p_i,其中p_i是金额除以用户{{ 1}}

j

我希望像下面这样具有数据框S_Tom = - (300/1300 * np.log(300/1300) + 700/1300 * np.log(700/1300) + 100/1300 * np.log(100/1300) + 200/1300 * np.log(200/1300)) S_Eva = - (700/1250 * np.log(700/1250) + 300/1250 * np.log(300/1250) + 250/1250 * np.log(250/1250) S_Tom = 1.157 S_Eva = 0.99

df1

2 个答案:

答案 0 :(得分:4)

使用groupbytransfrom来获取每个组的总和,然后将Amount列值除以每个组的总和并计算值:

g_sum = df.groupby('Name_Receive')['Amount'].transform('sum')
values = df['Amount']/g_sum
df['Entropy'] = -(values*np.log(values))

df1 = df.groupby('Name_Receive',as_index=False,sort=False)['Entropy'].sum()

print(df1)
  Name_Receive   Entropy
0          Tom  1.156988
1          Eva  0.989094

如果值包含0,则在groupby之后最后使用:

df1['Entropy'] = df1['Entropy'].fillna(0)

由于0*np.log(0)赋予nan以使其0使用fillna

答案 1 :(得分:0)

您还可以应用scipy的熵函数

from scipy.stats import entropy
E = df.groupby('Name_Receive')['Amount'].apply(lambda x : entropy(x.value_counts(), base=2)).reset_index()