我正在尝试按用户对 df 进行分组,并使用以下规则对该用户的每次出现应用权重。
最终权重应如下所示:
用户 | 订购 | 重量 |
---|---|---|
乔希 | 1 | 0.4 |
乔希 | 2 | 0.2 |
乔希 | 3 | 0.4 |
利亚姆 | 1 | 0.4 |
利亚姆 | 3 | 0.4 |
利亚姆 | 2 | 0.2 |
艾比 | 1 | 0.5 |
艾比 | 2 | 0.5 |
到目前为止,我已经完成了以下操作,这给了我在“final_wt”列中想要的结果,但我想知道是否有更好的方法以更少的中间步骤来实现此目的?
import pandas as pd
import numpy as np
# list of name, degree, score
user = ["josh", "josh", "josh", "liam", "liam", "liam", "abby", "abby"]
order = [1, 2, 3, 1, 3, 2, 1, 2]
device = ["a", "a", "a", "b", "a", "b", "c", "a"]
# dictionary of lists
dict = {'user': user, 'order': order, 'device': device}
df = pd.DataFrame(dict)
def func(T):
if len(T) < 3:
return 1/len(T)
else:
return 0.2/(len(T)-2)
df['wt']= df.groupby('user')['order'].transform(lambda x: func(x))
df['grpsize']= df.groupby('user')['order'].transform(lambda x: len(x))
df['final_wt'] = np.where(
df['grpsize'] < 3, df['wt'], np.where(
df['order'] ==1 , 0.4, np.where(
df['order'] == df['grpsize'] , 0.4, df['wt'])))
有没有一种方法可以修改应用于 groupby 的 .transform() 条件,以便我可以以不那么老套的方式计算权重?
或者有没有办法修改我的函数以应用于单个组元素而不是整个组?
提前非常感谢您!!
我通过执行以下操作改进了我的解决方案:
df['final_wt']= df.groupby('user')['order'].transform(lambda x: np.where( ((x==1) | (x==len(x)))& (len(x)>2), 0.4, func(x)))