我想将一个函数应用于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
的解决方案,每个函数对应一个输出列。
答案 0 :(得分:1)
尝试从pandas
返回Series
tuple
而不是example
:
def example(group):
....
return pd.Series([M * 2 * X, M * 2 * Y, M * (R2 - 1)], index=list('abc'))