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进行操作,我强烈建议您使用上述中间对象。