将组聚合成行向量(而不是标量)

时间:2015-12-07 19:52:34

标签: python pandas dataframe

我想将一个函数应用于groupby对象中的每个组,以便该函数对每个组的多个列进行操作,并返回1 x n “行向量”结果。我希望这些行向量的 n 条目在结果DataFrame中形成 n 新列的内容。

这是一个例子。

import pandas as pd
import numpy as np

df = pd.DataFrame.from_records([(0, 0, 0.616, 0.559),
                                (0, 0, 0.976, 0.942),
                                (0, 0, 0.363, 0.223),
                                (0, 0, 0.033, 0.225),
                                (0, 0, 0.950, 0.351),
                                (0, 1, 0.272, 0.004),
                                (0, 1, 0.167, 0.177),
                                (0, 1, 0.520, 0.157),
                                (0, 1, 0.435, 0.547),
                                (0, 1, 0.266, 0.850),
                                (1, 0, 0.368, 0.544),
                                (1, 0, 0.067, 0.064),
                                (1, 0, 0.566, 0.533),
                                (1, 0, 0.102, 0.431),
                                (1, 0, 0.240, 0.997),
                                (1, 1, 0.867, 0.793),
                                (1, 1, 0.519, 0.477),
                                (1, 1, 0.110, 0.853),
                                (1, 1, 0.160, 0.155),
                                (1, 1, 0.735, 0.515)],
                                columns=list('vwxy'))

grouped = df.groupby(list('vw'))

def example(group):
    X2 = np.var(group['x'])
    Y2 = np.var(group['y'])
    X = np.sqrt(X2)
    Y = np.sqrt(Y2)
    R2 = X2 + Y2
    M = 1.0/(R2 + 1)
    return (M * 2 * X, M * 2 * Y, M * (R2 - 1))

这很接近:

grouped.apply(example).reset_index()

#    v  w                                                  0
# 0  0  0  (0.596122357697, 0.450073544336, -0.664884906839)
# 1  0  1  (0.229241003533, 0.555057863705, -0.799599481139)
# 2  1  0   (0.326212671335, 0.53100544639, -0.782060425392)
# 3  1  1  (0.523276087715, 0.433768876798, -0.733503031723)

...但我所追求的是:

#    v  w         a         b         c
# 0  0  0  0.596122  0.450074 -0.664885
# 1  0  1  0.229241  0.555058 -0.799599
# 2  1  0  0.326213  0.531005 -0.782060
# 3  1  1  0.523276  0.433769 -0.733503

我怎样才能做到这一点?

修改example函数是可以的,只要它继续以某种形式返回所有3个值。 IOW,我不想要一个基于用{3}替换example的解决方案,每个函数对应一个输出列。

1 个答案:

答案 0 :(得分:1)

尝试从pandas返回Series tuple而不是example

def example(group):
    ....
    return pd.Series([M * 2 * X, M * 2 * Y, M * (R2 - 1)], index=list('abc'))