WedX - журнал о программировании и компьютерных науках

Нормализовать значения в мультииндексном фрейме данных?

Как нормализовать мультииндексный фрейм данных?

Скажем, у меня есть кадр данных:

d = pd.DataFrame([["a",1,3],["a",2,2],["b",4,4],["b",5,8]], 
                  columns=["name","value1","value2"])

как рассчитать нормализованные значения для каждого «имени»?

Я знаю, как нормализовать базовый фрейм данных:

d = (d-d.mean(axis=0))/data.std(axis=0, ddof=1)

но я не могу применить это к каждой группе «имя» моего фрейма данных

ТАК результат, который я хочу:

name, value1, value2
a     -0.5     0.5
a      0.5    -0.5
b     -0.5    -1
b      0.5     1

Я пробовал groupby и мультииндексный фрейм данных, но, вероятно, я делаю это неправильно.


  • Когда вы говорите 'вычислить нормализованные значения для каждого имени', хотите ли вы нормализовать внутри каждого столбца (по вертикали), а не внутри группы =› нормализовать по одной строке? 11.05.2018

Ответы:


1

Нормализация по группе — это один из примеров в документации по группировке. Но это не совсем то, что вы, кажется, хотите здесь.

In [2]: d.groupby('name').transform(lambda x: (x-x.mean())/x.std(ddof=1))
Out[2]: 
     value1    value2
0 -0.707107  0.707107
1  0.707107 -0.707107
2 -0.707107 -0.707107
3  0.707107  0.707107

Ваш желаемый результат предполагает, что вы действительно хотите нормализовать значения в каждой группе имен со ссылкой на элементы в value1 и value2. Для чего-то подобного вы можете применить функцию к каждой группе отдельно и собрать результат заново.

In [3]: def normalize(group):                                                      
    mean = group.values.ravel().mean()
    std = group.values.ravel().std(ddof=1)
    return group.applymap(lambda x: (x - mean)/std)
   ....: 

In [4]: pd.concat([normalize(group) for _, group in d.set_index('name').groupby(level=0)])
Out[4]: 
        value1    value2
name                    
a    -1.224745  1.224745
a     0.000000  0.000000
b    -0.660338 -0.660338
b    -0.132068  1.452744
16.07.2013
  • По-видимому, flatten делает копию массива. ravel() работает так же, но без копии. 16.07.2013
  • Я не знал этого. Спасибо! 16.07.2013
  • Спасибо вам обоим! извините, я пока не могу голосовать из-за моей низкой репутации! Теперь я начинаю лучше понимать, как работать с пандами! 16.07.2013
  • OP хочет нормализовать внутри столбца, а не внутри группы =› нормализовать по одной строке. 11.05.2018

  • 2

    Вы уверены, что результат, который вы дали, является правильным? Я предполагаю, что вы хотите нормализовать value1 и value2 отдельно. Если это не так, дайте мне знать.

    #  Easier with `name` as the index.
    
    In [65]: d = d.set_index('name')
    
    In [66]: d
    Out[66]: 
          value1  value2
    name                
    a          1       3
    a          2       2
    b          4       4
    b          5       8
    
    In [68]: means = g.mean()
    
    In [69]: stds = g.std()
    
    In [70]: means
    Out[70]: 
          value1  value2
    name                
    a        1.5     2.5
    b        4.5     6.0
    
    In [71]: stds
    Out[71]: 
            value1    value2
    name                    
    a     0.707107  0.707107
    b     0.707107  2.828427
    
    In [76]: g.transform(lambda x: (x - means) / stds)
    Out[76]: 
            value1    value2
    name                    
    a    -0.707107  0.707107
    a     0.707107 -0.707107
    a          NaN       NaN
    b          NaN       NaN
    b    -0.707107 -0.707107
    b     0.707107  0.707107
    
    # Get rid of the nans
    
    In [77]: g.transform(lambda x: (x - means) / stds).dropna()
    Out[77]: 
            value1    value2
    name                    
    a    -0.707107  0.707107
    a     0.707107 -0.707107
    b    -0.707107 -0.707107
    b     0.707107  0.707107
    
    16.07.2013
  • да, извините, вы правы, я неправильно нормализовал! Большое спасибо, для дальнейшего использования, я думаю, вы забыли g = d.groupby(name) 16.07.2013
  • Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]