pandas произведение столбца с его индексом groupby - PullRequest
0 голосов
/ 11 сентября 2018

Я работаю с фреймом данных, и мне пришлось группировать, чтобы выполнить некоторые операции с моими данными.

Это пример моего Dataframe:

 I  SI   deltas

 1  10   0.1
 1  14   0.1
 2  10   0.1
 2  18   0.3
 1  17   0.05
 2  30   0.3
 1  10   0.4
 1  14   0.2
 2  10   0.1
 2  18   0.2
 1  17   0.15

Теперь для каждого I я рассчитываю относительную частоту SI следующим образом:

results = df.groupby(['I', 'SI'])[['deltas']].sum()
#for each I, we sum all the weights (Deltas)
denom = results.groupby('I')['deltas'].sum()
#for each I, we divide each  deltas by the sum, getting them normalized to one
results.deltas = results.deltas / denom

Итак, мой Dataframe теперь выглядит так:

I = 1

             deltas 

  SI = 10     0.5
  SI = 14     0.3
  SI = 17     0.2

I = 2

             deltas 

  SI = 10     0.2
  SI = 18     0.5
  SI = 30     0.3

....

Что янужно сделать, чтобы вывести для каждого I сумму дельт, умноженных на их относительную SI:

     I = 1       sum =    0.5 * 10 + 0.3*14 + 0.2*17 = 12.6 
     I = 2       sum =    0.2*10 + 18*0.5 + 30*0.3 = 21

Но так как сейчас я работаю с фреймом данных, где индексы I и SI, я не знаю, какиспользуй их.Я попробовал этот код:

     for idx2, j in enumerate(results.index.get_level_values(0).unique()):
        #print results.loc[j]
        f.write("%d\t"%(j)+results.loc[j].to_string(index=False)+'\n')

, но я не уверен, как мне поступить, чтобы получить значения индексов

1 Ответ

0 голосов
/ 11 сентября 2018

Предположим, у вас есть входной фрейм данных df после ваших первоначальных преобразований.Если SI является вашим индексом, поднимите его до столбца с помощью df = df.reset_index() в качестве начального шага.

   I  SI  weight
0  1  10     0.5
1  1  14     0.3
2  1  17     0.2
3  2  10     0.2
4  2  18     0.5
5  2  30     0.3

Затем можно рассчитать произведение SI и weight, а затем использовать GroupBy + sum:

res = df.assign(prod=df['SI']*df['weight'])\
        .groupby('I')['prod'].sum().reset_index()

print(res)

   I  prod
0  1  12.6
1  2  20.0

Для отдельного изолированного кадра данных можно использовать np.dot для точечного произведения.

s = pd.Series([0.5, 0.3, 0.2], index=[10, 14, 17])
s.index.name = 'SI'

res = np.dot(s.index, s)  # 12.6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...