Назначить подмножество значений в пандас-фрейм данных с помощью MultiIndex - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть DataFrame df:

                             **Count**
**Environment** **Type**    
**A**            a           100
                 b           200
                 c           300
                 d           400
                 e           500
                 f           600
**B**            a           1000
                 b           2000
                 c           3000
                 d           4000
                 e           5000
                 f           6000

. df.index выплевывает следующий индекс:

    MultiIndex(levels=[['A', 'B'], ['a', 'b', 'c', 'd', 'e', 'f']],
               labels=[[0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1], 
                       [0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5]],
               names=['A', 'B'])

Мне нужно рассчитать процент отсчетов на A иБ. Итак, я делаю:

sums = df.groupby(level = 0).sum()
df.loc['A'] = df.loc['A'].apply(lambda x: x/sums.loc['A','Count'])
df.loc['B'] = df.loc['B'].apply(lambda x: x/sums.loc['B','Count'])

Однако это приводит к тому, что все значения равны NaN.

Я подозреваю, что индекс df.loc['B'].apply(lambda x: x/sums.loc['B','Count']) не совпадает с индексомdf, но она должна совпадать с частью df, которую я выбираю.

Они сами по себе

df.loc['A'].apply(lambda x: x/sums.loc['A','Count'])
df.loc['B'].apply(lambda x: x/sums.loc['B','Count'])

имеют нужные мне значения, поэтому деление работает.Но присвоение не дает.

Как назначить результат вышеупомянутого выражения для части кадра данных df?

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Вы можете просто сделать df/sums, без необходимости цикла.

Поскольку вы хотите назначить определенную часть фрейма данных, вы можете сделать это следующим образом.Держите глубину вычисленного df на 1 уровень выше.

df.loc['A',:] = df.loc['A',:,:].apply(lambda x: x/sums.loc['A','Count'])
0 голосов
/ 10 декабря 2018

Использование div для присвоения значения

s=df.Count.div(df.Count.sum(level=0),axis=0,level=0)
df['per']=s
df
Out[1253]: 
                          Count       per
**Environment** **Type**                 
A               a           100  0.047619
                b           200  0.095238
                c           300  0.142857
                d           400  0.190476
                e           500  0.238095
                f           600  0.285714
B               a          1000  0.047619
                b          2000  0.095238
                c          3000  0.142857
                d          4000  0.190476
                e          5000  0.238095
                f          6000  0.285714
...