如何根据行是否满足条件将函数应用于数据框组?

问题描述 投票:0回答:1

我正在尝试按用户对 df 进行分组,并使用以下规则对该用户的每次出现应用权重。

  1. 如果用户在我要分配的 df 中出现 3 次或以上:
  • 第一次和最后一次出现的权重为 0.4
  • 每个剩余事件的权重为 0.2/(发生次数 - 2)(将剩余 20% 除以所有其他事件)
  1. 如果用户出现次数少于 3 次,则应用加权:1/# 出现次数

最终权重应如下所示:

用户 订购 重量
乔希 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() 条件,以便我可以以不那么老套的方式计算权重?

或者有没有办法修改我的函数以应用于单个组元素而不是整个组?

提前非常感谢您!!

python group-by
1个回答
0
投票

我通过执行以下操作改进了我的解决方案:

df['final_wt']= df.groupby('user')['order'].transform(lambda x: np.where( ((x==1) | (x==len(x)))& (len(x)>2), 0.4, func(x)))

© www.soinside.com 2019 - 2024. All rights reserved.