我知道,当您使用 DataFrame 列调用 groupby.transform 时,该列将传递给转换数据的函数。但我无法理解的是如何将多列传递给函数。
people = DataFrame(np.random.randn(5, 5), columns=['a', 'b', 'c', 'd', 'e'], index=['Joe', 'Steve', 'Wes', 'Jim', 'Travis'])
key = ['one', 'two', 'one', 'two', 'one']
现在我可以很容易地贬低数据等,但我似乎无法正确做的是使用多个列值作为函数的参数来转换组内的数据。例如,如果我想为每个观察添加一个值为 a.mean() - b.mean() * c 的列“f”,如何使用变换方法来实现。
我尝试了以下变体
people['f'] = float(NA)
Grouped = people.groupby(key)
def TransFunc(col1, col2, col3):
return col1.mean() - col2.mean() * col3
Grouped.f.transform(TransFunc(Grouped['a'], Grouped['b'], Grouped['c']))
但这显然是错误的。我也确实将函数包装在一个lamba中,但也不能完全做到这一点。
我可以通过以下方式遍历组来实现结果:
for group in Grouped:
Amean = np.mean(list(group[1].a))
Bmean = np.mean(list(group[1].b))
CList = list(group[1].c)
IList = list(group[1].index)
for y in xrange(len(CList)):
people['f'][IList[y]] = (Amean - Bmean) * CList[y]
但这似乎不是一个令人满意的解决方案,特别是如果索引是非唯一的。我也知道这必须可以使用 groupby.transform。
概括一下这个问题:如何编写函数来转换具有涉及使用多列值的参数的数据?
帮助表示赞赏。