2 回答
TA贡献1828条经验 获得超6个赞
实际上,没有必要遍历组行。
任务是应用一个函数来计算每个组的比率。
需要的第一个组件是 lambda 函数,应用于组(Numpy一维数组)中的每一列,检查所有元素是否相同。实际上,它检查元素0是否等于从1开始的所有元素并返回1(作为True)或0作为(False)。
lambda v: (v[0] == v[1:]).all().astype(int)
那么概念就是:
grp.values
- 将当前组转换为Numpy数组。[:, 1:-1]
- 删除第一个 ( ID ) 和最后一个 ( ngroup ) 列。apply_along_axis(...)
- 将上述功能应用于每个剩余的列。参数0是轴号(将函数应用于每个列切片)。结果是一个由 1 或 0 组成的向量。... * [5, 30, 15, 50]
- 将上述向量乘以每列的权重,得到列评级。np.sum(...)
- 对它们求和,得到整体组率。
这样做的代码是:
def getRate(grp):
return np.sum(np.apply_along_axis(lambda v: (v[0] == v[1:]).all().astype(int),
0, grp.values[:, 1:-1]) * [5, 30, 15, 50])
然后将上述函数应用于每个组:
df_test.groupby('ngroup').apply(getRate)
结果是:
ngroup
0 85
1 95
dtype: int64
请注意,第1组的结果是0 * 5 + 1 * 30 + 1 * 15 + 1 * 50 = 95,而不是您帖子中的75,因为PHONE列的权重为50 (请参见示例的第 1 点)。
TA贡献1843条经验 获得超7个赞
IIUC,您可以创建一个包含列名称的速率字典,然后是stack您map的值,同时仅对重复值求和。
rates = {'NAME' : 5, 'LAST_NAME' : 30, 'ADDRESS' : 0 ,'PHONE' : 50 }
s = df.groupby('ngroup').agg(list).stack().explode().duplicated().to_frame()
s['vals'] = s.index.get_level_values(1).map(rates)
s[s[0].eq(True)].groupby(level=0).sum()
0 vals
ngroup
0 3.0 85.0
1 4.0 130.0
添加回答
举报