如何从 Pandas 数据帧计算信息的香农熵?
How to compute Shannon entropy of Information from a Pandas Dataframe?
我有一个数据框 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
使用groupby
and transfrom
得到每组的总和,然后将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
.
您还可以应用 scipy
的熵函数
from scipy.stats import entropy
E = df.groupby('Name_Receive')['Amount'].apply(lambda x : entropy(x.value_counts(), base=2)).reset_index()
我有一个数据框 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
使用groupby
and transfrom
得到每组的总和,然后将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
.
您还可以应用 scipy
的熵函数from scipy.stats import entropy
E = df.groupby('Name_Receive')['Amount'].apply(lambda x : entropy(x.value_counts(), base=2)).reset_index()