首页 > 解决方案 > 关于 pandas groupby 应用列作为参数

问题描述

我有一个函数f(a, b)where a, barepandas.Series并且它pandas.Series c以相同的长度返回aand b

现在我有两个系列AB它们具有相同的 Multiindex。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),并将它们连接在一起。

我该怎么做?

样本数据、函数和预期输出。(我知道在 pandas 中使用其他方法可以轻松处理此示例,但我只想谈谈 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

标签: pythonpandaspandas-groupby

解决方案


你可以这样解决问题:

# 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)))

推荐阅读