python - 具有不同条件的自定义函数 + 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
非常欢迎任何建议!
谢谢。
解决方案
推荐阅读
- python - IOError: [Errno 24] 打开的文件太多 - 但我关闭了所有文件
- javascript - ReactJs 组件结构 - 模态内的表单
- python - 'make pycaffe' 错误应该怎么办?
- bash - 在bash中拆分列表
- python-2.7 - 我如何覆盖按钮“打印”的打印功能
- javascript - 如何在对象数组上使用 localStorage
- c++ - 在给定数组中生成所有元素对的有效方法
- java - 我们能否在到达服务器之前识别http(post)请求是否被修改?
- java - 如何在sqlite中保存Servervalue.TIMESTAMP?
- azure-devops - VSTS 错误:未找到与模式匹配的测试程序集