【问题标题】:Getting groups by group index按组索引获取组
【发布时间】:2021-05-28 19:14:45
【问题描述】:

我想按组索引访问组。我的数据框如下所示

import pandas as pd
from io import StringIO
import numpy as np

data = """
id,name
100,A
100,B
100,C
100,D
100,pp;
212,E
212,F
212,ds
212,G
212, dsds
212, sas
300,Endüstrisi`
"""
df = pd.read_csv(StringIO(data))

我想按 'id' 分组并按组索引访问组。

dfg=df.groupby('id',sort=False,as_index=False)
dfg.get_group(0)

我希望这会返回第一组,即id =1 的组(这是第一组)

【问题讨论】:

    标签: pandas group-by python-3.8


    【解决方案1】:

    你需要传递id的值:

    dfg=df.groupby('id',sort=False)
    a = dfg.get_group(100)
    
    print (a)
        id name
    0  100    A
    1  100    B
    2  100    C
    3  100    D
    4  100  pp;
    

    dfg=df.groupby('id',sort=False)
    a = dfg.get_group(df.loc[0, 'id'])
    
    print (a)
        id name
    0  100    A
    1  100    B
    2  100    C
    3  100    D
    4  100  pp;
    

    如果需要枚举组,可以使用GroupBy.ngroup

    dfg=df.groupby('id',sort=False)
    a = df[dfg.ngroup() == 0]
    
    print (a)
        id name
    0  100    A
    1  100    B
    2  100    C
    3  100    D
    4  100  pp;
    

    详情

    print (dfg.ngroup())
    0     0
    1     0
    2     0
    3     0
    4     0
    5     1
    6     1
    7     1
    8     1
    9     1
    10    1
    11    2
    dtype: int64
    

    编辑:另一个想法是如果需要按位置选择组(所有 id 都是连续组),并通过位置选择的 id 的唯一值进行比较:

    ids = df['id'].unique()
    print (ids)
    [100 212 300]
    
    print (df[df['id'].eq(ids[0])])
        id name
    0  100    A
    1  100    B
    2  100    C
    3  100    D
    4  100  pp;
    
    print (df[df['id'].eq(ids[1])])
         id   name
    5   212      E
    6   212      F
    7   212     ds
    8   212      G
    9   212   dsds
    10  212    sas
    

    【讨论】:

    • 我不想通过id 访问。我想通过组索引访问。我相信当我们分组时,它会为每个组生成唯一的索引,对(0,1,2,...)。我想通过该组索引访问。
    • @Shew - 我认为ngroup 喜欢最后的解决方案?
    • 基于 loc 的解决方案给了我错误TypeError: 'Series' objects are mutable, thus they cannot be hashed 有什么问题?
    • 我试图比较效率。 %timeit a = dfg.get_group(df.loc[0, 'id'])545 µs ± 911 ns per loop (mean ± std. dev. of 7 runs, 1000 loops each)%timeit a = df[dfg.ngroup() == 0]10.2 ms ± 333 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)。有很大的不同。基于 loc 的解决方案要快得多。
    • 这样,我怎样才能访问我的第二组?我想对一些组索引进行采样(我得到了大约 100k 个组并采样了大约 4 或 5 个组),然后仅绘制这些特定组的数据。
    猜你喜欢
    • 1970-01-01
    • 2016-05-06
    • 2019-12-24
    • 1970-01-01
    • 2022-01-02
    • 2023-03-24
    • 2021-12-10
    • 2013-06-03
    • 1970-01-01
    相关资源
    最近更新 更多