我已经连续两天把我的头撞在墙上了。有了一些想法,尝试实施,但是速度非常慢,所以想知道是否有人可以指出一种更好的方法。这就是我想要的:
我有一个这样的数据框:
pd.DataFrame({'var1':[1, 1, 4, 4, 4, 7, 8], 'var2': [2, 2, 5, 5, 5, 8, 8], 'var3':[3, 3, 6, 6, 6, 9, 8], 'label':['a', 'a', 'b', 'b', 'c', 'd', 'd']})
label var1 var2 var3
0 a 1 2 3
1 a 1 2 3
2 b 4 5 6
3 b 4 5 6
4 c 4 5 6
5 d 7 8 9
6 d 8 8 8
因此,我要计算的是给定重复变量的匹配标签的百分比。例如,第0行,第1行是基于var1,var2和var3的重复项,第2行,第3行和第4行也是如此,而由于var3的值不同,第5行和第6行不是重复项。在两个重复的组中,如果我们检查标签,我们会看到组1(行0、1)的标签也匹配('a','a'),而组2(行2、3、4)不匹配匹配(“ b”,“ b”,“ c”)。因此,该百分比为1/2 = 50%。
目前,这是我正在做的:
任何帮助表示赞赏!
使用groupby
方法:
def matched_group(grp):
if len(grp) == 1:
return np.nan
return grp.nunique() == 1
is_matched = df.groupby(['var1', 'var2', 'var3'])['label'].apply(matched_group).dropna()
match_pcnt = is_matched.sum()/len(is_matched)
该matched_group
函数返回一个布尔值,指示一组变量中的所有标签是否都是唯一的,或者np.nan
该组变量只有一个元素,表示该组不重复。然后,在删除空值之后,只需计算匹配项,然后除以重复组的总数即可。
上面的代码给出了0.5
for的值match_pcnt
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句