[英]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.