簡體   English   中英

使用“bin size”/“frequency”重新采樣Pandas Dataframe

[英]Resample Pandas Dataframe with “bin size”/“frequency”

9我有一個多索引數據幀,我想重新采樣以將數據點的頻率降低3倍(意味着每3行變為1)。

這個:

                    time  value
   ID  measurement  
ET001            0     0      2
                 1  0.15      3
                 2   0.3      4
                 3  0.45      3
                 4   0.6      3
                 5  0.75      2
                 6   0.9      3
ET002            0     0      2
                 1  0.16      5
                 2  0.32      4
                 3  0.45      3
                 4   0.6      3
                 5  0.75      2

我想變成這樣:

                    time  value
   ID  measurement  
ET001            0  0.15      3 
                 1   0.6    2.7
                 2   0.9      3
ET002            0  0.16    3.7 
                 1   0.6    2.7

我試圖將我的時間列轉換為像這樣的pandas datetime索引,然后使用resample:

df = df.set_index(pd.DatetimeIndex(timecourse_normed['Time']))
df = df.groupby(level=0).resample(rule='0.1S', how=np.mean) 

但是第一行給了我實際的日期(1970年的東西),這對第二行來說是無益的。 瀏覽arund堆棧溢出我發現了一些類似的quiestios,它們都有解決方案,不是基於熊貓的重采樣 - 而且,遺憾的是,我的用例不可行。

你能幫我個忙嗎?

我認為你的想法可能是 - 將每個ID內的記錄分成3個記錄(如SQL中的ntile(3) )組並計算平均值。 要創建這個數字,我們可以使用這樣一個事實,即每行已經有序列號 - 索引的measurement級別。 所以我們可以將這個數字除以3得到我們需要的數字:

>>> df
                   time  value  ntile
ID    measurement                  
ET001 0            0.00      2      0
      1            0.15      3      0
      2            0.30      4      0
      3            0.45      3      1
      4            0.60      3      1
      5            0.75      2      1
      6            0.90      3      2
ET002 0            0.00      2      0
      1            0.16      5      0
      2            0.32      4      0
      3            0.45      3      1
      4            0.60      3      1
      5            0.75      2      1

因此我們可以使用這樣的輔助函數並將其應用於每個組以獲得所需的結果。

>>> def helper(x):
...     x = x.reset_index()
...     x = x.groupby(x['measurement'].div(3)).mean()
...     del x['measurement']
...     return x
... 
>>> df.groupby(level=0).apply(helper)
                   time     value
ID    measurement                
ET001 0            0.15  3.000000
      1            0.60  2.666667
      2            0.90  3.000000
ET002 0            0.16  3.666667
      1            0.60  2.666667

希望能幫助到你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM