Python - Pandas - 按组绘制列计数 - 随时间变化绘制每个组

1 投票
1 回答
5996 浏览
提问于 2025-04-18 16:06

抱歉标题写得太模糊了,很难用几句话表达我的问题。

我最近读了《Python数据分析》,并试着把书里的内容应用到实际例子中。我把一些数据框和图片里的信息替换成了通用的名称(比如app1、app2)。其他的数据和结果都是实际的。

我处理了一个日志文件,生成了一个包含错误级别、错误日期和产生错误的应用程序的CSV文件。我想创建一个可视化图表,X轴表示时间,四条不同的线图(每个应用程序一条)显示每个应用程序在特定时间的错误数量。但我得到的结果是一个线图,显示所有应用程序的错误数量作为一个值,跨越一段时间。

counts = df['APP'].groupby(df['DATE']).count() counts = df['APP'].groupby([df['DATE'], df['APP']]).count()

这是我在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函数非常好用。

撰写回答