首页 > 解决方案 > 具有不同条件的自定义函数 + groupby Pandas 按变量分组

问题描述

我想在最初看起来像这样的数据上使用 groupby 生成一些权重:

V1   V2   MONTH  CHOICES  PRIORITY
X    T1   M1     C1       1
X    T1   M1     C2       0
X    T1   M1     C3       0
X    T2   M1     C1       1
X    T2   M1     C5       0
X    T2   M1     C6       0
X    T2   M1     C2       1
X    T1   M2     C1       1
X    T1   M2     C2       0
X    T1   M2     C3       0
X    T2   M2     C1       0
X    T2   M2     C5       1
X    T2   M2     C6       0
X    T2   M2     C2       1

基本上,当 MONTH 与 M1 不同时,我希望标记的选项的权重等于任何非标记选项的两倍。
示例:如果您有 (C1, C2, C3) 并且 C1 是唯一标记的,则权重将为:0.5 / 0.25 / 0.25。

同时,在第一个月,我希望权重只关注标记的选择。上一个示例将变为 (1/0/0)。

数据精度:
对于给定的元组 (V1,V2,MONTH),我们最多可以有两个选择标记为优先级(根本不可能有优先级)。

这是我尝试过的:

def weights_preferences(data):
     if (data.MONTH.values != 'M1'):
         data['WEIGHTS'] = 1/(len(data)+data[data.PRIORITY==1].shape[0])
         data['WEIGHTS'] = data.apply(lambda x : 2*x.WEIGHTS if x.PRIORITY==1 else x.WEIGHTS, axis=1)
     elif data.MONTH.values == 'M1' & data[data.PRIORITY==1].shape[0]==0 :
         data['WEIGHTS'] = 1/(len(data))
     else :
         if data[data.PREFERENCE==1].shape[0]==1 :
             data['WEIGHTS'] = [1 if x[1].PRIORITY==1 else 0 for x in data.iterrows()]
         else :
             data['WEIGHTS'] = [0.5 if x[1].PRIORITY==1 else 0 for x in data.iterrows()]
     return data

tmp = tmp.groupby(['V1','V2','MONTH']).apply(weights_preferences)

问题是,由于我按“MONTH”分组,因此该值似乎不再出现在应用“weights_preferences”的数据中。

PS:输出看起来像这样

V1   V2   MONTH  CHOICES  PRIORITY  WEIGHTS
X    T1   M1     C1       1         1
X    T1   M1     C2       0         0
X    T1   M1     C3       0         0
X    T2   M1     C1       1         0.5
X    T2   M1     C5       0         0
X    T2   M1     C6       0         0
X    T2   M1     C2       1         0.5
X    T1   M2     C1       1         0.5
X    T1   M2     C2       0         0.25
X    T1   M2     C3       0         0.25
X    T2   M2     C1       0         0.16
X    T2   M2     C5       1         0.33
X    T2   M2     C6       0         0.16
X    T2   M2     C2       1         0.33

非常欢迎任何建议!

谢谢。

标签: pythonpandaspandas-groupby

解决方案


推荐阅读