如何计算数据框中与一列不同的行数?

时间:2019-11-30 19:16:55

标签: python pandas dataframe pandas-groupby

我知道一个人不应该这样做,但是我不知道该怎么办,而是给我一个我所面临的不太普遍的问题,并完全改变这个问题。

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个相同的预测变量行因其评级而不同。

好吗?

2 个答案:

答案 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