2017-06-27 149 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繪製它(*參數)