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)
进行复制)