python - 如何从 Pandas Dataframe 计算信息的香农熵?

标签 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 我想将香农熵计算为 S_j = -sum_i p_i\log p_i 其中 p_i 是金额除以用户 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

df1
     Name     Entropy
0    Tom      1.157
1    Eva      0.99

最佳答案

使用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

关于python - 如何从 Pandas Dataframe 计算信息的香农熵?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53177327/

相关文章:

python - 使用 slider 小部件以交互方式更改图像内容

python - Pandas - 将事件持续时间的每个小时转换为单独的行

python - 如何计算数据框列中的值?

python - 计算非实数数据的增量熵

php - 网络上的熵源

python解析xml文本

python - ('Unexpected credentials type',无, 'Expected', 'service_account')与 oauth2client(Python)

python - 使用 pandas.to_hdf 快速读取 df 中的指定列

python - 使用互信息作为相似性度量的分层聚类?

python - 使用 pycluster 进行加权聚类