【问题标题】:How to calculate the number of matched groups of rows in pandas dataframe?如何计算熊猫数据框中匹配的行数?
【发布时间】:2016-09-01 04:24:20
【问题描述】:

为了这个,我已经把头撞在墙上 2 天了。有一些想法,尝试实施,但速度非常慢,所以想知道是否有人能指出更好的方法。这就是我想要的:

我有一个这样的数据框:

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 行也是如此,而第 5 行和第 6 行由于 var3 的值不同而不是重复项。在两个重复的组中,如果我们检查标签,我们会看到第 1 组(第 0、1 行)标签也匹配('a'、'a'),而第 2 组(第 2、3、4 行)不匹配匹配('b','b','c')。因此,百分比为 1/2 = 50%。

目前,这就是我正在做的:

  1. 使用 var1、var2、var3 对数据框进行排序
  2. 循环遍历行并记录不与下一行重复的行的索引
  3. 使用以前的索引对数据帧进行切片,以仅保留具有重复项的行。每组重复的行都是一个组。计算组的总数。
  4. 在新的数据框中,检查每个组的标签列,如果一个组中的所有标签都匹配,则将其计为匹配组。
  5. 使用匹配组的数量来划分组的总数。

感谢任何帮助!

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    使用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,这意味着该组不重复。然后,删除空值后,只计算匹配项并除以重复组的总数。

    上面的代码为match_pcnt 提供了0.5 的值。

    【讨论】:

      【解决方案2】:
      gb = df.groupby(['var1', 'var2', 'var3', 'label'])
      size = gb.size()
      size
      
      var1  var2  var3  label
      1     2     3     a        2
      4     5     6     b        2
                        c        1
      7     8     9     d        1
      8     8     8     d        1
      dtype: int64
      

      lvls = list(range(size.index.nlevels))
      size2 = size.groupby(level=lvls[:-1]).size()
      size2
      
      var1  var2  var3
      1     2     3       1
      4     5     6       2
      7     8     9       1
      8     8     8       1
      dtype: int64
      

      (size2 == 1).sum() / float(size2.shape[0])
      
      0.75
      

      【讨论】:

      • 感谢@piRSquared 的快速回复!这看起来很棒。我想澄清的唯一一件事是我只想查看“重复组”,即在所有变量中至少有 2 个完全匹配的实例的组,然后我想查看组的百分比在相应的组中具有匹配的标签。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-08
      • 2016-06-05
      • 1970-01-01
      • 2019-06-30
      • 1970-01-01
      • 2015-01-28
      • 1970-01-01
      相关资源
      最近更新 更多