pandas 切片DataFrameGroupBy对象

xggvc2p6  于 2023-02-11  发布在  其他
关注(0)|答案(2)|浏览(169)

是否有方法对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对象,我的意思是只访问组的子集。2在上面的例子中,GroupBy对象将包含3个组,分别为A = 1、A = 2和A = 3。3由于某些原因,我可能只对A = 1和A = 2的组感兴趣。

idv4meu8

idv4meu81#

看起来您需要使用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
kmpatx3s

kmpatx3s2#

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

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

相关问题