2017-06-27 77 views
1

这是我第一次使用熊猫和iPython笔记本,并且无法找出我的问题的正确搜索条件。如何分组数据和绘制折线图

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

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 
+0

你可以添加一些样本数据? – jezrael

回答

2

我想你需要先通过过滤器或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() 

graph

+0

哦,我们可以做嵌套..看起来像它的工作。现在我怎样才能为3个网站选择特定的项目和情节线图? –

+0

我想是的,但代码打字时没有数据。所以可以添加'print(build_group.head())'到你的问题?如果需要帮助选择,但我认为['DataFrame.xs'](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.xs.html)应该有所帮助。 – jezrael

+0

请参阅编辑 –

0

关键字是: DataFrame.mean(轴=无,skipna =无,级别=无,numeric_only =无,** kwargs)[源]

参考是让在这个环节https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.mean.html

然后,你可以这样做: 成功= DF [“成功”> 0 这将创建一个新的数据帧成功。当“成功”是你的列,具有1或0

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