【问题标题】:How to group data and plot line graphs如何分组数据和绘制折线图
【发布时间】:2017-11-30 03:29:38
【问题描述】:

这是我第一次使用 pandas 和 iPython 笔记本,但无法为我的问题找出正确的搜索词。

我有一个 .xls 文件,用于位于 3 个站点 ABC 的 3 个构建服务器的编译时间数据。这些构建服务器编译多个项目,所以我会选择任何特定的项目。因此我需要像这样绘制数据(对于一个特定的项目 - 不是全部在一个图表中,以保持简单):

X-axis = date
Y-axis = average build time on that date

3 lines for sites A, B and C

到目前为止我做了什么:

import pandas as pd
import numpy as np
import matplotlib as plt 

file=  r'/home/abc/Downloads/request.xls'
df = pd.read_excel(file,parse_dates=['Date'])

build_times = df[['Date','site','project','Duration']]
build_group = build_times.groupby(['Date','site','project']).mean()

我需要以下帮助:

  1. 我如何只选择成功的构建 如果有一列 status 有 0 和 1。

  2. 如何使用上述 X 轴和 Y 轴绘制站点 ABC(针对特定项目)的线。

编辑

经过@jezrael 的回答,我可以得到以下数据

2017-03-27  A   project1    963.200000
            B   project2    4587.176471
            C   project2    1449.375000
            C   project1    1449.375000
  .......
2017-03-28  A   project1    93.200000
            B   project1    4787.176471
            C   project2    1339.375000
            C   project1    1749.375000

【问题讨论】:

  • 可以添加一些示例数据吗?

标签: python pandas matplotlib ipython-notebook data-science


【解决方案1】:

我认为您需要先按boolean indexingquery 过滤:

build_group = build_times[build_times['status'] == 1]
                          .groupby(['Date','site','project'])['Duration'].mean()

或者:

build_group = build_times.query('status == 1')
                         .groupby(['Date','site','project'])['Duration'].mean()

输出与:

d={'Duration': [963.2, 4587.176471, 1449.375, 1449.375, 93.2, 4787.176471, 1339.375, 1749.375], 
'project': ['project1', 'project2', 'project2', 'project1', 'project1', 'project1', 'project2', 'project1'], 
'Date': [pd.Timestamp('2017-03-27 00:00:00'), pd.Timestamp('2017-03-27 00:00:00'), pd.Timestamp('2017-03-27 00:00:00'), pd.Timestamp('2017-03-27 00:00:00'), pd.Timestamp('2017-03-28 00:00:00'), pd.Timestamp('2017-03-28 00:00:00'), pd.Timestamp('2017-03-28 00:00:00'), pd.Timestamp('2017-03-28 00:00:00')], 
'site': ['A', 'B', 'C', 'C', 'A', 'B', 'C', 'C']}
build_group = pd.DataFrame(d).set_index(['Date','site','project'])['Duration']
print (build_group)
Date        site  project 
2017-03-27  A     project1     963.200000
            B     project2    4587.176471
            C     project2    1449.375000
                  project1    1449.375000
2017-03-28  A     project1      93.200000
            B     project1    4787.176471
            C     project2    1339.375000
                  project1    1749.375000
Name: Duration, dtype: float64

然后通过unstacklevel=1 重塑(因为level==1sites)并通过xs 选择。最后plot

#for check column names for typos
print (build_group.index.get_level_values(2).unique().tolist())
['project1', 'project2']

p = 'project1'
build_group = build_group.unstack(level=1).xs(p, level=1, axis=0)
print (build_group)
site            A            B         C
Date                                    
2017-03-27  963.2          NaN  1449.375
2017-03-28   93.2  4787.176471  1749.375

build_group.plot()

【讨论】:

  • 哦,我们可以做嵌套.. 看起来它工作正常。现在如何选择特定项目并为 3 个站点绘制折线图?
  • 我认为是的,但是代码输入时没有数据。那么可以在您的问题中添加print (build_group.head()) 吗?如果在选择方面需要帮助,但我认为 DataFrame.xs 应该会有所帮助。
  • 请参阅编辑
  • 谢谢,我添加了['Duration'].mean() instaed mean。请检查解决方案是否有效。谢谢。
  • 您的意思是 build_group = build_group.unstack(level=1).xs(p, level=1, axis=0) 而不是 df
【解决方案2】:

关键字是:

DataFrame.mean(axis=None, skipna=None, level=None, numeric_only=None, **kwargs)

参考在docs中给出

那么你可以这样做:

successful = df['success'] > 0

这将创建一个新的数据框successful。其中success 是您的列,包含 1 或 0。

对于 (2),您也可以这样做,只选择列并使用 df.plot(*args) 绘制它

【讨论】:

    猜你喜欢
    • 2015-09-25
    • 2021-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多