【问题标题】:Get all keys from GroupBy object in Pandas从 Pandas 中的 GroupBy 对象中获取所有键
【发布时间】:2017-07-19 16:15:58
【问题描述】:

我正在寻找一种方法来获取 GroupBy 对象中所有键的列表,但我似乎无法通过文档或 Google 找到一个。

肯定有一种方法可以通过它们的密钥访问组,如下所示:

df_gb = df.groupby(['EmployeeNumber'])
df_gb.get_group(key)

...所以我认为有一种方法可以访问 GroupBy 对象中的键列表(或类似列表)。我正在寻找这样的东西:

df_gb.keys
Out: [1234, 2356, 6894, 9492]

我想我可以遍历 GroupBy 对象并以这种方式获取密钥,但我认为必须有更好的方法。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您可以通过groupby 对象上的属性.groups 访问它,这将返回一个字典,字典的键为您提供组:

    In [40]:
    df = pd.DataFrame({'group':[0,1,1,1,2,2,3,3,3], 'val':np.arange(9)})
    gp = df.groupby('group')
    gp.groups.keys()
    
    Out[40]:
    dict_keys([0, 1, 2, 3])
    

    这是groups的输出:

    In [41]:
    gp.groups
    
    Out[41]:
    {0: Int64Index([0], dtype='int64'),
     1: Int64Index([1, 2, 3], dtype='int64'),
     2: Int64Index([4, 5], dtype='int64'),
     3: Int64Index([6, 7, 8], dtype='int64')}
    

    更新

    看起来是这样的,因为groups 的类型是dict,所以当您调用keys 时,不会维护组顺序:

    In [65]:
    df = pd.DataFrame({'group':list('bgaaabxeb'), 'val':np.arange(9)})
    gp = df.groupby('group')
    gp.groups.keys()
    
    Out[65]:
    dict_keys(['b', 'e', 'g', 'a', 'x'])
    

    如果您致电groups,您可以看到订单保持不变:

    In [79]:
    gp.groups
    
    Out[79]:
    {'a': Int64Index([2, 3, 4], dtype='int64'),
     'b': Int64Index([0, 5, 8], dtype='int64'),
     'e': Int64Index([7], dtype='int64'),
     'g': Int64Index([1], dtype='int64'),
     'x': Int64Index([6], dtype='int64')}
    

    然后维护密钥顺序,解决此问题的方法是访问每个组的.name 属性:

    In [78]:
    gp.apply(lambda x: x.name)
    
    Out[78]:
    group
    a    a
    b    b
    e    e
    g    g
    x    x
    dtype: object
    

    这不是很好,因为这不是矢量化的,但是如果您已经有一个聚合对象,那么您可以获取索引值:

    In [81]:
    agg = gp.sum()
    agg
    
    Out[81]:
           val
    group     
    a        9
    b       13
    e        7
    g        1
    x        6
    
    In [83]:    
    agg.index.get_level_values(0)
    
    Out[83]:
    Index(['a', 'b', 'e', 'g', 'x'], dtype='object', name='group')
    

    【讨论】:

      【解决方案2】:

      EdChum 回答的一个问题是,通过启动gp.groups.keys() 来获取密钥首先会构建完整的组字典。在大型数据帧上,这是一个非常缓慢的操作,实际上会使内存消耗翻倍。迭代速度更快:

      df = pd.DataFrame({'group':list('bgaaabxeb'), 'val':np.arange(9)})
      gp = df.groupby('group')
      keys = [key for key, _ in gp]
      

      执行这个列表理解让我在我的 groupby 对象上使用了16 s,而我不得不在 3 分钟后打断 gp.groups.keys()

      【讨论】:

        【解决方案3】:

        使用选项 sort=False 保留组键顺序 gp = df.groupby('group', sort=False)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-01-03
          • 2018-08-13
          • 1970-01-01
          • 1970-01-01
          • 2019-08-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多