О Pandas Groupby применять столбцы в качестве параметров - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть функция f(a, b), где a, b - это pandas.Series, и она возвращает pandas.Series c с одинаковой длиной a и b.

Теперь у меня есть две серии A и B, которые имеют один и тот же мультииндекс. A, B состоит из множества маленьких series(a1, a2, a3, a4, a5...), (b1, b2, b3, b4, b5...). Учитывая, что я не могу использовать f(A, B) для прямого вычисления результата. Я хочу использовать groupby, чтобы вычислить результат f(a1, b1), f(a2, b2), f(a3, b3) и объединить их вместе.

Как мне это сделать?

Пример данных, функции и ожидаемый результат. (Я знаю, что использование другого метода в пандах могло бы легко справиться с этим образцом, но я только хочу поговорить о методе groupby. Спасибо)

a1  0     0
    1     1
    2     2
    3     3
    4     4
    5     5
    6     6
    7     7
    8     8
    9     9
a2  0     1
    1     2
    2     3
    3     4
    4     5
    5     6
    6     7
    7     8
    8     9
    9    10
a3  0     2
    1     3
    2     4
    3     5
    4     6
    5     7
    6     8
    7     9
    8    10
    9    11

b1  0    0.0
    1    0.0
    2    0.0
    3    0.0
    4    0.0
    5    1.0
    6    0.0
    7    0.0
    8   -1.0
    9    0.0
b2  0    0.0
    1    1.0
    2    0.0
    3    0.0
    4    0.0
    5    0.0
    6    0.0
    7    0.0
    8   -1.0
    9    0.0
b3  0    0.0
    1    0.0
    2    0.0
    3    0.0
    4   -1.0
    5    0.0
    6    1.0
    7    0.0
    8    0.0
    9    0.0


c1  0     0.0
    1     0.0
    2     0.0
    3     0.0
    4     0.0
    5     5.0
    6     6.0
    7     7.0
    8    -8.0
    9    -9.0
c2  0     0.0
    1     2.0
    2     3.0
    3     4.0
    4     5.0
    5     6.0
    6     7.0
    7     8.0
    8    -9.0
    9   -10.0
c3  0     0.0
    1     0.0
    2     0.0
    3     0.0
    4    -6.0
    5    -7.0
    6     8.0
    7     9.0
    8    10.0
    9    11.0


def f(a, b):
    loc = 0
    res = np.zeros(len(a))
    for i in range(len(b1)):
        if b[i] != 0:
            if b[i] != loc:
                loc = b[i]
        res[i] = a[i] * loc
    return res

1 Ответ

0 голосов
/ 08 ноября 2018

Вы можете решить проблему следующим образом:

# result is a Series of numpy arrays
result = (
    pd.DataFrame({'A': A, 'B': B})
    .groupby(level=0)
    .apply(lambda x: f(x['A'], x['B'])))

# now result is a Series of float values
result = pd.Series(list(itertools.chain(*result.values)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...