切片DataGrameGroupBy对象

时间:2017-09-15 10:01:38

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

有没有办法切片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(...)

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您可以使用以下方式进行切片:

如果您想从每个组中分割[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(...)

答案 2 :(得分:0)

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

    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