Python 基于外部对象的索引聚合组

Python 基于外部对象的索引聚合组,python,pandas,pandas-groupby,Python,Pandas,Pandas Groupby,我有一个带有分类列的数据框和一些其他东西: >>> 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=

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

>>> 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
我希望能够将在
C
上完成的groupby应用于另一个数据帧。比如说

>>> 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
>>(df['A']-df['B'])。分组方式(df['C','D']])。平均值()
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“C:\Users\jfoxrabinovitz\AppData\Local\Continuum\anaconda3\lib\site packages\pandas\core\series.py”,第1678行,在groupby中
返回groupby_generic.SeriesGroupBy(
文件“C:\Users\jfoxrabinovitz\AppData\Local\Continuum\anaconda3\lib\site packages\pandas\core\groupby\groupby.py”,第403行,在\uuu init中__
石斑鱼,排除,obj=get_石斑鱼(
文件“C:\Users\jfoxrabinovitz\AppData\Local\Continuum\anaconda3\lib\site packages\pandas\core\groupby\grouper.py”,第617行,在get\u grouper中
分组(
文件“C:\Users\jfoxrabinovitz\AppData\Local\Continuum\anaconda3\lib\site packages\pandas\core\groupby\grouper.py”,第345行,在uu init中__
raise VALUERROR(f“非一维的“{t}”的分组”)
ValueError:“”的Grouper不是一维的

对于这个用例,您可以使用
系列.groupby
,它比
dataframe.groupby
更快

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

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

编辑:

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

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

你的意思是
(df['A']-df['B']).groupby(df['C']).mean()
?@anky.显然是的。这是重复的吗?一定是。我对熊猫还不够新,不知道如何正确搜索。或者,如果你发布一个答案,我很乐意接受。
g['A'].mean()-g['B'].mean()
也有效。@anky.如果索引不是一维,该怎么办?@anky.我重写了这个问题只是为了确保我理解,
assign
使用相同的基础数据和一个新的helper列创建一个新的df。除非我开始将内容分配给helper df,否则原始df不会受到影响。@madpysicator确切地说,它创建了一个df w的副本使用新列。如果内存有问题,可以通过设置新列并在以后分组来避免。将其分解为两个步骤:)BDW assign还可以用副本替换现有列(如果这有助于尝试
df.assign(a=1)
进行复制)