能否使用自定义函数进行分组转换?
data = {
'a':['a1','a2','a3','a4','a5'],
'b':['b1','b1','b2','b2','b1'],
'c':[55,44.2,33.3,-66.5,0],
'd':[10,100,1000,10000,100000],
}
import pandas as pd
df = pd.DataFrame.from_dict(data)
df['e'] = df.groupby(['b'])['c'].transform(sum) #this works as expected
print (df)
# a b c d e
#0 a1 b1 55.0 10 99.2
#1 a2 b1 44.2 100 99.2
#2 a3 b2 33.3 1000 -33.2
#3 a4 b2 -66.5 10000 -33.2
#4 a5 b1 0.0 100000 99.2
def custom_calc(x, y):
return (x * y)
#obviously wrong code here
df['e'] = df.groupby(['b'])['c'].transform(custom_calc(df['c'], df['d']))
从上面的例子中可以看出,我想探索能否将自定义函数传递到.transform()
中。我知道
.apply()
存在,但我想弄清楚是否可以仅使用.transform()
。更重要的是,我想了解如何制定一个正确的函数,以便将其传递到
.transform()
中以正确应用。P.S. 目前,我知道像
'count'
、sum
、'sum'
等默认函数可以正常工作。
c
和d
的总乘积还是每行的乘积?提供期望的输出将非常有帮助。 - user3483203.transform
最容易作用于单个序列。如果您想使用需要多个序列作为输入的函数进行转换,虽然可以完成,但这相当麻烦,并且通常可以通过其他避免转换的方式来完成(例如使用 map 函数)。 - ALollz.groupby.transform
候选项。由于您的函数返回一个Series
或数组,因此实际上没有什么需要转换的,因为通常使用它来将标量组值广播回原始DataFrame
中的所有其他成员。 - ALollz