當前 df:
Date Power
2011-04-18 17:00:01 245.83
2011-04-18 17:00:02 246.02
2011-04-18 17:00:03 245.72
2011-04-18 17:00:04 244.71
2011-04-18 17:00:05 245.93
2011-04-18 17:00:06 243.12
2011-04-18 17:00:07 244.72
2011-04-18 17:00:08 242.44
2011-04-18 17:00:09 246.42
2011-04-18 17:00:10 245.02
2011-04-18 17:00:11 244.02
2011-04-18 17:00:12 242.02
... ...
我想將上述資料幀拆分為大小為 n=4(大小可變)的視窗,并創建以下 df。
date start date end power
0 2011-04-18 17:00:01 2011-04-18 17:00:04 [245.83, 246.02, 245.72, 244.71]
1 2011-04-18 17:00:05 2011-04-18 17:00:08 [245.93, 243.12, 244.72, 242.44]
2 2011-04-18 17:00:09 2011-04-18 17:00:12 [246.42, 245.02, 244.02, 242.02]
... ... ... ...
Pandas 中是否有任何功能可以讓您執行此操作?我搜索了檔案,找不到任何可以用于此目的的內容。
uj5u.com熱心網友回復:
設定
import pandas as pd
import numpy as np
df = pd.DataFrame(
{
"Date":pd.date_range("2011-04-18 17:00:01", freq="s", periods=11),
"Power":[245, 246, 245, 244, 245, 243, 244, 242, 246, 245, 244],
}
)
n = 4
我沒有打擾小數點...
解決方案
def make_row(d):
return pd.Series({"date_start":d["Date"].min(), "date_end":d["Date"].max(), "power":d["Power"].to_list()})
df.groupby(np.floor(np.linspace(0,len(df)-1,len(df))/n)).apply(make_row)
這導致
date_start date_end power
0.0 2011-04-18 17:00:01 2011-04-18 17:00:04 [245, 246, 245, 244]
1.0 2011-04-18 17:00:05 2011-04-18 17:00:08 [245, 243, 244, 242]
2.0 2011-04-18 17:00:09 2011-04-18 17:00:11 [246, 245, 244]
解釋
np.floor(np.linspace(0,len(df)-1,len(df))/n)
這段代碼創建了一個陣列,其中有 n 個零,后跟 n 個,等等,直到長度為 df
我們對這個陣列進行分組,并將子資料幀傳遞給make_row函式,該函式回傳 apandas.Series以在新資料幀中形成一行。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/345062.html
