我想将一个函数应用于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


我该如何实现?

只要可以继续以某种形式返回所有3个值,就可以修改example函数。 IOW,我不需要基于3个独立函数替换example的解决方案,每个输出列均使用一个函数。

最佳答案

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

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

关于python - 将组聚合为行向量(而不是标量),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34141972/

10-12 20:14