Pandas groupby выдает ошибку при использовании sum () - PullRequest
1 голос
/ 06 января 2020

Я пытаюсь вычислить матрицу рассеяния между кластерами. Чтобы сделать это, для каждого кластера (называемого «группа» в примере ниже) мне нужно выполнить операцию, которая приводит к матрице, а затем выполнить поэлементное добавление матриц из каждого кластера.

Для этого я пытаюсь сделать следующее:

import pandas as pd
import numpy as np

df = pd.DataFrame({'group': [1, 2, 1, 0, 0, 0, 1, 2],
                   'A': [1.5, 0.5, 2.5, 0.5, 1.5, 0.5, 1.5, 0.5],
                   'B': [3.5, 2.5, 3.5, 2.5, 3.5, 2.5, 3.5, 2.5]})
features = list(df.columns)
features.remove('group')


def g(x, mu):
    y = np.array([np.mean(x) - mu])
    print((y.T @ y)*len(x))
    print("")
    return (y.T @ y)*len(x)


m = len(df.index)
mu = df.groupby('group')[features].apply(lambda x: (np.multiply(x.count(), np.mean(x)))/m).sum()
print("mu:")
print(mu)

Sb = df.groupby('group')[features].apply(g, mu=(mu)).sum()

В этом примере выдается ошибка TypeError: Series.name must be a hashable type в последней строке. Оператор print в функции g показывает ожидаемый результат, см. Ниже, поэтому я считаю, что ошибка связана с операцией .sum().

[[0.2553 0.1458]
 [0.1458 0.0833]]

[[1.5052 1.0625]
 [1.0625 0.75  ]]

[[0.7912 0.625 ]
 [0.625 0.5    ]]

Результат, который я ожидал, добавив * Операция 1012 * была поэлементным добавлением трех вышеприведенных матриц.

Ожидаемый результат:

[[2.5416 1.8333]
 [1.8333 1.3333]]

Любые идеи, почему это дает мне ошибку и что я могу сделать, чтобы исправить это?

Обновление 1: Использование:

Sb = df.groupby('group').apply(g, mu=(mu)).sum()

вместо

Sb = df.groupby('group')[features].apply(g, mu=(mu)).sum()

дает правильную матрицу, дополненную нансами. Почему features вызывает ошибку?

1 Ответ

3 голосов
/ 06 января 2020

Вы пробовали это?

sb=df.groupby('group').apply(g, mu=(mu)).sum()

это дает следующий результат:

[[2.54166667 1.83333333        nan]
 [1.83333333 1.33333333        nan]
 [       nan        nan        nan]]

Это то, что вы хотите?

Вам все еще приходится иметь дело с нансами, хотя

Изменить, чтобы ответить на ваши комментарии:

Чтобы ответить на вашу проблему в комментариях, вы можете изменить свой функция как показано ниже:

def g(x, mu):
    x=x[["A","B"]] #or x=x[features]
    y = np.array([np.mean(x) - mu])
    print((y.T @ y)*(len(x)))
    print("")
    return (y.T @ y)*(len(x))

, а затем:

sb=df.groupby(['group']).apply(g, mu=(mu)).sum()
print(sb)

, что дает:

[[2.54166667 1.83333333]
 [1.83333333 1.33333333]]
...