首页 > 解决方案 > 基于来自外部对象的索引聚合组

问题描述

我有一个带有分类列和其他一些东西的数据框:

>>> np.random.seed(0xFEE7)
>>> df = pd.DataFrame({'A': np.random.randint(10, size=10), 
                       'B': np.random.randint(10, size=10),
                       'C': np.random.choice(['A', 'B'], size=10)})
>>> df
   A  B  C
0  0  0  B
1  4  0  B
2  6  6  A
3  8  3  B
4  0  2  A
5  8  4  A
6  4  1  B
7  8  7  A
8  4  4  A
9  1  1  A

我希望能够将完成的 groupbyC应用于另一个数据帧。例如,假设

>>> ser = df['A'] - df['B']

我希望能够使用索引df.groupby(['C', D])来计算ser. 我可以计算单个列的组均值,例如,C像这样:

>>> (df['A'] - df['B']).groupby(df['C']).mean()
C
A   -1.250000
B    3.666667
dtype: float64

但是,使用多索引不起作用:

>>> (df['A'] - df['B']).groupby(df[['C', 'D']]).mean()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\jfoxrabinovitz\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\series.py", line 1678, in groupby
    return groupby_generic.SeriesGroupBy(
  File "C:\Users\jfoxrabinovitz\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\groupby\groupby.py", line 403, in __init__
    grouper, exclusions, obj = get_grouper(
  File "C:\Users\jfoxrabinovitz\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\groupby\grouper.py", line 617, in get_grouper
    Grouping(
  File "C:\Users\jfoxrabinovitz\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\groupby\grouper.py", line 345, in __init__
    raise ValueError(f"Grouper for '{t}' not 1-dimensional")
ValueError: Grouper for '<class 'pandas.core.frame.DataFrame'>' not 1-dimensional

标签: pythonpandaspandas-groupby

解决方案


您可以将 aseries.groupby用于此用例,它比dataframe.groupby.

由于我们已经有一个计算序列,并且我们使用 grouper 列获得结果的平均值,因此我们最好使用 grouper 列,series.groupby然后.mean()聚合结果:

(df['A'] - df['B']).groupby(df['C']).mean()

编辑:

对于多个键,您可以使用df.assign分配一个帮助列并使用dataframe.groupby对多个键进行分组:

df.assign(k=(df['A'] - df['B'])).groupby(['C','D'])['k'].mean()
#k is our helper column(series)

推荐阅读