2016-02-17 27 views
0

我在設定的時間間隔從多個樣本收集了一些實驗數據,在數據幀組織像這樣:熊貓時間序列區間和索引

Studynumber Time Concentration 
1    20   80 
1    40   60 
1    60   40 
2    15   95 
2    44   70 
2    65   30 

雖然時間間隔都應該是固定的,有數據的一些變化取決於他們實際收集的時間。我想創建「時間」列的容器,計算「平均」濃度,然後比較每次學習次數的實際濃度與平均濃度之間的差異。

要做到這一點,我創建了一個名爲「每局」一欄,然後使用GROUPBY計算平均值:

data['roundtime']=data['Time'].round(decimals=-1) 
meanconc = data.groupby('roundtime')['Concentration'].mean() 

這給出了一個熊貓系列的平均濃度,以每局爲指標。然後,我想這回主幀計算出每個實際濃度和平均濃度之間的差別:

data['meanconcentration']=meanconc.loc[data['roundtime']].reset_index()['Concentration'] 

這適用於前60倍左右的值,但隨後返回NaN每個條目,我認爲是因爲數據的指數比平均濃度指數更長。

一方面,這看起來像一個索引問題 - 同樣,這可能是我剛剛接近錯誤的方式。所以我的問題是:a)這種方法可以工作嗎?和b)有沒有更好的方法呢?歡迎所有建議!

+0

你想'數據['meanconcentration '] = data.groupby('roundtime')['Concentration']。transform('mean')'?這會返回一個「系列」,其索引與您的原始df – EdChum

+0

相對應您可以將它放入答案中,並解釋.transform('mean')的作用是什麼?它不給我NaN - 只需要檢查它給我正確的值!謝謝 – TMrtSmith

回答

1

使用transformgroupby聚集增加一列,這將創建一個Series與它的指數對準原來的DF這樣你就可以回到正確地分配它:

In [4]: 
df['meanconcentration'] = df.groupby('roundtime')['Concentration'].transform('mean') 
df 

Out[4]: 
    Studynumber Time Concentration roundtime meanconcentration 
0   1 20    80   20    87.5 
1   1 40    60   40    65.0 
2   1 60    40   60    35.0 
3   2 15    95   20    87.5 
4   2 44    70   40    65.0 
5   2 65    30   60    35.0 
0

你寫

然後,我想這回主框計算差值每個實際濃度和平均濃度之間

非常類似的東西出現在文檔中的groupby-apply在​​。請注意,您可以直接計算出這一點:

>>> data.groupby('roundtime').apply(
    lambda g: g.Concentration - g.Concentration.mean()) 
roundtime 
20   0 -7.5 
      3 7.5 
40   1 -5.0 
      4 5.0 
60   2 5.0 
      5 -5.0 
Name: Concentration, dtype: float64 

請注意,您可以輕鬆地在這個應用.reset_index(),把它合併到原始數據幀,如果你想等


另一種方法是計算平均值,並直接把它合併:

pd.merge(
    data.groupby('roundtime').mean(), 
    data, 
    left_index=True, 
    right_on='roundtime', 
    how='right') 

(請注意,這將會創建列「」 Concentration_X「for the mean, and」 Concentration_ Y'`原來的)。

+0

所以我認爲.reset_index()是我在嘗試將它合併回原始數據框時遇到問題的地方? – TMrtSmith

+0

我真的不認爲這是它。我的猜測是尺寸是錯誤的。如果你說除了60以外的所有東西都是NaN,那可能是因爲groupby的維數是60.如果你打算這麼做,我會去「合併」。當然,你可以繞過這一切,就像我在答案中所做的一樣。 –

+0

好吧,你可以完成最後一步合併回原始數據框。它只是data = pd.merge(data,data.groupby ...)? – TMrtSmith