Python - Pandas - 按组绘制列计数 - 随时间变化绘制每个组
抱歉标题写得太模糊了,很难用几句话表达我的问题。
我最近读了《Python数据分析》,并试着把书里的内容应用到实际例子中。我把一些数据框和图片里的信息替换成了通用的名称(比如app1、app2)。其他的数据和结果都是实际的。
我处理了一个日志文件,生成了一个包含错误级别、错误日期和产生错误的应用程序的CSV文件。我想创建一个可视化图表,X轴表示时间,四条不同的线图(每个应用程序一条)显示每个应用程序在特定时间的错误数量。但我得到的结果是一个线图,显示所有应用程序的错误数量作为一个值,跨越一段时间。
![counts = df['APP'].groupby(df['DATE']).count()](https://i.stack.imgur.com/OTpBW.png)
![counts = df['APP'].groupby([df['DATE'], df['APP']]).count()](https://i.stack.imgur.com/JwLLt.png)
这是我在iPython中的代码
from pandas import DataFrame, Series
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv('clean.txt')
counts = df['APP'].groupby([df['DATE'], df['APP']]).count()
counts.plot(rot=45)
这是我的数据框
LEVEL DATE APP
0 ERROR 2014-07-29 12:35:55.916 app1
1 ERROR 2014-07-29 12:35:55.916 app1
2 ERROR 2014-07-29 12:35:55.916 app1
3 ERROR 2014-07-29 12:35:55.874 app2
4 ERROR 2014-07-29 12:35:55.908 app3
5 ERROR 2014-07-29 12:35:55.908 app3
6 ERROR 2014-07-29 12:35:55.908 app3
7 ERROR 2014-07-29 12:35:55.908 app3
8 ERROR 2014-07-29 12:35:55.908 app3
9 ERROR 2014-07-29 12:35:55.975 app4
这是我的数据框,经过分组后的样子。
DATE APP
2014-07-29 12:35:56.028 app1 6
2014-07-29 12:35:56.029 app1 3
2014-07-29 12:35:56.030 app1 3
2014-07-29 12:35:56.031 app1 6
2014-07-29 12:35:56.032 app1 3
...
2014-07-30 13:08:57.769 app2 1
app1 6
app4 2
2014-07-30 13:08:57.770 app2 5
我哪里出错了?我在数据框中有我需要的所有信息,所以我知道在尝试绘图之前,我一定是在正确处理这些数据时漏掉了什么。
谢谢任何信息。
1 个回答
0
d = {'level' : ['ERROR', 'ERROR', 'ERROR', 'ERROR', 'ERROR', 'ERROR', 'ERROR', 'ERROR', 'ERROR', 'ERROR'],
'DATE' : ['2014-07-29 12:35:55.916', '2014-07-29 12:35:55.916', '2014-07-29 12:35:55.916', '2014-07-29 12:35:55.874', '2014-07-29 12:35:55.908', '2014-07-29 12:35:55.908', '2014-07-29 12:35:55.908', '2014-07-29 12:35:55.908', '2014-07-29 12:35:55.908', '2014-07-29 12:35:55.975'],
'APP' : ['app1', 'app1', 'app1', 'app2', 'app3', 'app3', 'app3', 'app3', 'app3', 'app4']}
df = pd.DataFrame(d)
接下来,创建一个数据透视表:
df.pivot_table(values='level', index='DATE', columns='APP', aggfunc=len).plot(kind='bar')
我把它画成了柱状图,因为在这个例子数据中,每个应用只有一次出现,所以没有线可以画。如果你想画线图,只需把'bar'改成'line'就可以了。
值得注意的是,如果你有成千上万的不同时间点,并且想查看整天的错误数量,你需要做一些额外的处理。这个时候,resample函数非常好用。