Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫分组、累计总和和分类图_Python_Pandas_Dataframe_Group By - Fatal编程技术网

Python 熊猫分组、累计总和和分类图

Python 熊猫分组、累计总和和分类图,python,pandas,dataframe,group-by,Python,Pandas,Dataframe,Group By,具有数据帧的: date path size 0 2019-05-10 /bar/A 3 1 2019-05-10 /bar/B 7 2 2019-05-10 /bar/C 2 3 2019-05-14 /bar/A 4 4 2019-05-14 /bar/B 8 5 2019-05-14 /bar/C 23 6 2019-05-18 /bar/A 11 7 2019-05-18 /bar/B 75 8

具有数据帧的:

    date        path    size
0   2019-05-10  /bar/A  3
1   2019-05-10  /bar/B  7
2   2019-05-10  /bar/C  2
3   2019-05-14  /bar/A  4
4   2019-05-14  /bar/B  8
5   2019-05-14  /bar/C  23
6   2019-05-18  /bar/A  11
7   2019-05-18  /bar/B  75
8   2019-05-18  /bar/C  32
我想按路径分组,并返回每个日期的列大小的累计总和

看看这个答案:

简单的df.groupby[path][size].cumsum或df.groupby[path,date][size].cumsum将不起作用

最后,累积总和应按日期绘制,并按组着色,以指示尺寸随时间的累积增长

            /bar/A /bar/B /bar/C
2019-05-10  3      7      2
2019-05-14  7      15     26
2019-05-18  18     90     58

如果没有seaborn或其他工具,是否有基于pandas的解决方案?

我认为您可以通过旋转表格,然后应用累积总和来实现这一点

pivot = pd.pivot_table(df, values="size", index=["date"], columns=["path"], aggfunc=np.sum)
pivot = pivot.cumsum()
根据您的问题示例,查看结果:

df
Out[14]: 
         date    path  size
0  2019-05-10  /bar/A     3
1  2019-05-10  /bar/B     7
2  2019-05-10  /bar/C     2
3  2019-05-14  /bar/A     4
4  2019-05-14  /bar/B     8
5  2019-05-14  /bar/C    23
6  2019-05-18  /bar/A    11
7  2019-05-18  /bar/B    75
8  2019-05-18  /bar/C    32
pivot = pd.pivot_table(df, values="size", index=["date"], columns=["path"], aggfunc=np.sum)
pivot.cumsum()
Out[16]: 
path        /bar/A  /bar/B  /bar/C
date                              
2019-05-10       3       7       2
2019-05-14       7      15      25
2019-05-18      18      90      57

我认为你可以通过数据透视表,然后应用累积和来实现这一点

pivot = pd.pivot_table(df, values="size", index=["date"], columns=["path"], aggfunc=np.sum)
pivot = pivot.cumsum()
根据您的问题示例,查看结果:

df
Out[14]: 
         date    path  size
0  2019-05-10  /bar/A     3
1  2019-05-10  /bar/B     7
2  2019-05-10  /bar/C     2
3  2019-05-14  /bar/A     4
4  2019-05-14  /bar/B     8
5  2019-05-14  /bar/C    23
6  2019-05-18  /bar/A    11
7  2019-05-18  /bar/B    75
8  2019-05-18  /bar/C    32
pivot = pd.pivot_table(df, values="size", index=["date"], columns=["path"], aggfunc=np.sum)
pivot.cumsum()
Out[16]: 
path        /bar/A  /bar/B  /bar/C
date                              
2019-05-10       3       7       2
2019-05-14       7      15      25
2019-05-18      18      90      57

@不。这会把一切都弄平。这将是所有项目的累计总和。我想保持路径的明确性。在我的例子中,这是三个累积结果question@splash58说得好。添加了预期的输出。@Nope。这会把一切都弄平。这将是所有项目的累计总和。我想保持路径的明确性。在我的例子中,这是三个累积结果question@splash58说得好。添加了预期输出。关闭。诀窍是使用index=df.date.dt.month进行数据透视。那么,你是按月份分组,而不是按天分组,对吗?事实上,在我最初的帖子中,我已经将时间包括在小时/分钟/秒中。在这种情况下,这种方法是行不通的。那么,我错过了你原来的帖子。但请看我最后的编辑。根据您的示例,它按预期工作。但是如果你有日期时间,而不是日期,那么你可以决定只选择小时、天、月、年,这取决于你。但我认为我提供的解决方案正是你想要的:比罚款更多。谢谢,这很有效。作为一种解决方法:df[date].dt.date将足够通用。请关闭。诀窍是使用index=df.date.dt.month进行数据透视。那么,你是按月份分组,而不是按天分组,对吗?事实上,在我最初的帖子中,我已经将时间包括在小时/分钟/秒中。在这种情况下,这种方法是行不通的。那么,我错过了你原来的帖子。但请看我最后的编辑。根据您的示例,它按预期工作。但是如果你有日期时间,而不是日期,那么你可以决定只选择小时、天、月、年,这取决于你。但我认为我提供的解决方案正是你想要的:比罚款更多。谢谢,这很有效。作为一种解决方法:df[date].dt.date将足够通用。