我知道一个人不应该这样做,但是我不知道该怎么办,而是给我一个我所面临的不太普遍的问题,并完全改变这个问题。
data_train= pd.DataFrame({"buying": [0,1,0,1,0,0,0], "maint":[0,1,0,1,0,0,0], "doors": [0,1,0,1,0,0,0],
"persons": [0,1,0,1,0,0,0], "lug_boot":[0,1,0,1,0,0,0], "safety": [0,1,0,1,0,0,0],
"rating" : [1,1,2,1,3,4,5] })
data_train
data_train = data_train.groupby(["buying", "maint", "doors", "persons","lug_boot", "safety"]) \
.agg({"buying":"count", "maint":"nunique"})#.query("buying>1")["maint"].sum()
data_train
我想做的是看看我们有多少个不同的行,具有相同的第一行(预测变量),但评级不同。因此,如果我可以在第一列中进行格鲁比运算,然后计算得到的不同等级的数量,那就太好了。重要的假设是,如果两行相同,则事先将其擦除。因此,人们可以找到因评分而异的行,但找不到相同的行。
在我的示例中,第1行和第3行相同,因此将其擦除并且没有问题。但是对于其他人,它们的评级不同,因此存在问题,我应该得到5作为回报,因为有5个相同的预测变量行因其评级而不同。
好吗?
答案 0 :(得分:2)
可以通过以下方式完成:
df = pd.DataFrame({"x1": ["A", "A", "A", "A", "A", "B", "B"], "x2":[1, 1, 2, 3, 4, 2, 3], "x3": [0,1,0,1,0,0,0]})
df.groupby(["x1", "x2"]).agg({'x1':"count", "x3":"nunique"}).query("x1 >1")["x3"].sum()
给予
2
我们正在收集每个组的行数(足以汇总w.r.t x1
)和最后一列的不同值的数目。我们希望每个组至少有2行,对吗?然后,我们只对子查询后的结果求和,即用至少2个条目过滤组。
答案 1 :(得分:1)
由于事情发生了太多变化,因此可以获取新信息。一个解决方案就是:
nuniques = data_train.groupby(data_train.columns[:-1].tolist())['rating'].nunique()
在这里您可以看到每行(或每行组)的唯一评分。现在,如果nunique == 1
并且由于我们没有重复项,那么我们就可以使用nunique>1
筛选组。
因此
nuniques[nuniques>1].sum()
5