Pandas Multiindex - выполнить операцию над группой - PullRequest
0 голосов
/ 02 мая 2018

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

import pandas as pd
d={'name':['foo','foo', 'foo', 'bar', 'bar', 'bar','baz', 'baz'],
   'grp':[1, 2, 4, 1, 4, 8, 2, 4], 
   'val':[50, 100, 200, 25, 100, 200, 75, 150]}
df = pd.DataFrame(data=d)
df.set_index(['name', 'grp'], inplace=True)
df

Дает мне такой фрейм данных:

          val
name grp
foo  1     50
     2    100
     4    200
bar  1     25
     4    100
     8    200
baz  2     75
     4    150

То, что я хотел бы сделать, это выполнить операцию над каждым значением для каждой группировки 'grp' на основе самого низкого значения в 'grp'. Например, нормализуйте каждое значение 'val', разделив каждое в группе на самое низкое значение, чтобы получить что-то вроде этого:

          val
name grp
foo  1     50  1
     2    100  2
     4    200  4
bar  1     25  1
     4    100  4
     8    200  8
baz  2     75  1
     4    150  2

Обратите внимание, что вычисление выполняется для столбца 'val', но на основе минимального значения 'val' числа 'grp'. Я изо всех сил пытаюсь найти хороший способ обойти это, так что спасибо за любые указатели. Я использую Python v3.6, если это имеет значение.

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Использование div с level

df.div(df.min(level=[0]),level='name')
Out[157]: 
          val
name grp     
foo  1    1.0
     2    2.0
     4    4.0
bar  1    1.0
     4    4.0
     8    8.0
baz  2    1.0
     4    2.0
0 голосов
/ 02 мая 2018

Вам нужно будет groupby, а затем transform на min:

df /= df.groupby(level=0).transform('min')
df

          val
name grp     
foo  1    1.0
     2    2.0
     4    4.0
bar  1    1.0
     4    4.0
     8    8.0
baz  2    1.0
     4    2.0

Для целочисленного деления замените /= на //=.

...