Python groupby的groupby,用于选择表中的值

Python groupby的groupby,用于选择表中的值,python,pandas,Python,Pandas,我有一个数据框,如下所示: marker date value identifier EA 2007-01-01 0.33 55 EA 2007-01-01 0.73 56 EA 2007-01-01 0.51 57 EA 2007-02-01 0.13 55 EA 2007-02-01 0.2

我有一个数据框,如下所示:

marker    date         value       identifier

EA    2007-01-01      0.33            55
EA    2007-01-01      0.73            56
EA    2007-01-01      0.51            57
EA    2007-02-01      0.13            55
EA    2007-02-01      0.23            57
EA    2007-03-01      0.82            55
EA    2007-03-01      0.88            56
EB    2007-01-01      0.13            45
EB    2007-01-01      0.74            46
EB    2007-01-01      0.56            47
EB    2007-02-01      0.93            45
EB    2007-02-01      0.23            47
EB    2007-03-01      0.82            45
EB    2007-03-01      0.38            46
EB    2007-03-01      0.19            47
现在我想在这个数据帧上按值进行选择,所以我使用

df.groupby(marker).get_group('EA')
但是我还想得到值的平均值,注意我有一个重复的日期索引,所以现在我必须做两个groupby,因为索引不同,导致

df.groupby(marker).get_group('EA').groupby(df.groupby(marker).get_group('EA').index.date).mean()['value'].plot()

清楚的东西不是很清楚。如何在不创建中间变量的情况下实现这一点?

您不能,因为您在上面关于
断言错误的评论中写道。Pandas希望根据与分组数据帧长度完全相同的某个序列执行(第二个)
groupby
。如果您不愿意首先创建一个描述
EA
值的
DataFrame
,那么您基本上只能动态地重新创建它

这不仅不容易辨认,而且不必要的昂贵。说到这里,我会像这样重写你的代码:

eas = df[df.marker == 'EA']
eas.value.groupby(eas.date).mean().plot();

groupby
进行分组并保留单个组是一种非常昂贵的方法,只需根据关键字进行筛选。

现在还不清楚您想在这里实现什么,您想按标记和日期分组吗?但是你的索引似乎也是一个日期,但这不是你的df所显示的。索引实际上是日期,它只是格式化而已。是的,我想按标记和日期分组,而且似乎['marker',df.index.date]不会剪切它,而且不必在group by中进行分组,因为索引大小不同。所以为什么不
df[df['marker']=='EA'].groupby(df.index.date).mean()['value'].plot()
?当我尝试这样做时,我得到了断言错误:Grouper和axis的长度必须相同非常感谢,这澄清了我的想法。我同意这在计算上可能会很昂贵,但是这两个GroupBy会使用更少的内存吗?谢谢。记忆保护是一个有趣的观点,但我担心它需要比我更深入地了解熊猫的实现。在任何情况下,无论您是通过过滤还是通过groupby进行操作,我强烈建议您使用上述中间对象。