【问题标题】:Slicing a DataGrameGroupBy object切片 DataGrameGroupBy 对象
【发布时间】:2018-02-24 11:45:25
【问题描述】:

有没有办法对 DataFrameGroupBy 对象进行切片?

例如,如果我有:

df = pd.DataFrame({'A': [2, 1, 1, 3, 3], 'B': ['x', 'y', 'z', 'r', 'p']})

   A  B
0  2  x
1  1  y
2  1  z
3  3  r
4  3  p

dfg = df.groupby('A')

现在,返回的 GroupBy 对象由 A 中的值索引,我想选择它的一个子集,例如进行聚合。可能是这样的

dfg.loc[1:2].agg(...)

或者,对于特定的列,

dfg['B'].loc[1:2].agg(...)

编辑。更清楚地说:通过对 GroupBy 对象进行切片,我的意思是只访问组的一个子集。在上面的示例中,GroupBy 对象将包含 3 个组,分别为 A = 1、A = 2 和 A = 3。由于某些原因,我可能只对 A = 1 和 A = 2 的组感兴趣。

【问题讨论】:

标签: python pandas dataframe group-by pandas-groupby


【解决方案1】:

看来您需要使用 iloc 的自定义函数 - 但如果使用 agg 是必要的,则返回聚合值:

df = df.groupby('A')['B'].agg(lambda x: ','.join(x.iloc[0:3]))
print (df)
A
1    y,z
2      x
3    r,p
Name: B, dtype: object

df = df.groupby('A')['B'].agg(lambda x: ','.join(x.iloc[1:3]))
print (df)
A
1    z
2     
3    p
Name: B, dtype: object

对于多列:

df = pd.DataFrame({'A': [2, 1, 1, 3, 3], 
                   'B': ['x', 'y', 'z', 'r', 'p'], 
                   'C': ['g', 'y', 'y', 'u', 'k']})
print (df)
   A  B  C
0  2  x  g
1  1  y  y
2  1  z  y
3  3  r  u
4  3  p  k

df = df.groupby('A').agg(lambda x: ','.join(x.iloc[1:3]))
print (df)
   B  C
A      
1  z  y
2      
3  p  k

【讨论】:

    【解决方案2】:

    您可以像这样使用 apply 进行切片:

    如果你想从每个组中分割[1:3]

    n [53]: df
    Out[53]: 
       A  B
    0  2  x
    1  1  y
    2  1  z
    3  3  r
    4  3  p
    
    In [54]: dfg = df.groupby('A')
    
    In [56]: dfg.apply(lambda x: x.loc[1:3])
    Out[56]: 
         A  B
    A        
    1 1  1  y
      2  1  z
    3 3  3  r
    

    如果你只想对一列进行切片(例如B

    In [55]: dfg.apply(lambda x: x['B'].loc[1:3])
    Out[55]: 
    A   
    1  1    y
       2    z
    3  3    r
    Name: B, dtype: object
    

    然后,聚合,你只需像这样链接调用:

    dfg.apply(lambda x: x['B'].loc[1:3]).agg(...)
    

    【讨论】:

    • OP 要求更少的组,上述查询每组返回的条目更少。
    【解决方案3】:

    如果我理解正确,您只需要一些组,但应该完全返回:

        A   B
    1   1   y
    2   1   z
    0   2   x
    

    您可以通过提取键然后根据这些键选择组来解决您的问题。

    假设您已经知道这些组:

    pd.concat([dfg.get_group(1),dfg.get_group(2)])
    

    如果您不知道组名并且只是在寻找随机的 n 个组,这可能会起作用:

    pd.concat([dfg.get_group(n) for n in list(dict(list(dfg)).keys())[:2]])
    

    这两种情况下的输出都是普通的 DataFrame,而不是 DataFrameGroupBy 对象,因此先过滤 DataFrame 然后再聚合可能会更聪明:

    df[df['A'].isin([1,2])].groupby('A')
    

    未知组也一样:

    df[df['A'].isin(list(set(df['A']))[:2])].groupby('A')
    

    我相信有一些 Stackoverflow 答案与此相关,例如 How to access pandas groupby dataframe by key

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-30
      相关资源
      最近更新 更多