Как вычислить энтропию Шеннона для информации из кадра данных Pandas? - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть фрейм данных 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

1 Ответ

0 голосов
/ 06 ноября 2018

Используйте groupby и 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.

...