[英]Averaging the last few entries of every unique value in a column to generate new df
我的數據框的df.head()
看起來像這樣。 我正在測量 7 到 9 Hz 頻率之間的數據,並且有大約 100 個唯一的Psnr
值。 如果我想創建一個新數據框,其中一個點代表每個唯一Psnr
的最后五分鍾的Psnr
,那么最好的方法是什么?
Datum_Zeit Psnr
2018-10-04 14:43:11.410 2
2018-10-04 14:43:11.600 2
2018-10-04 14:43:11.790 2
2018-10-04 14:43:11.970 2
2018-10-04 14:43:12.160 2
一種可能的方法是創建子數據幀,再次過濾和合並它們,如下所示。 但是,我確信必須有一個更簡單的解決方案
dfs = {k: df[df['Psnr'] == k] for k in df['Psnr'].unique()}
我相信您需要首先過濾每個組的最后 5 分鍾數據,然后按Psnr
列聚合mean
:
print (df)
Datum_Zeit Psnr Speed Torque
0 2018-10-04 14:38:11.410 2 8 6
1 2018-10-04 14:39:11.600 2 7 0
2 2018-10-04 14:40:11.790 2 1 1
3 2018-10-04 14:41:11.970 2 9 3
4 2018-10-04 14:43:12.160 2 5 1
5 2018-10-04 14:39:11.600 3 7 0
6 2018-10-04 14:40:11.790 3 1 1
7 2018-10-04 14:44:11.970 3 9 3
8 2018-10-04 14:45:12.160 3 5 1
df['Datum_Zeit'] = pd.to_datetime(df['Datum_Zeit'])
s = df.groupby('Psnr')['Datum_Zeit'].transform('max')
df = df[df['Datum_Zeit'].between(s - pd.Timedelta(300, 's'), s)]
print (df)
Datum_Zeit Psnr Speed Torque
1 2018-10-04 14:39:11.600 2 7 0
2 2018-10-04 14:40:11.790 2 1 1
3 2018-10-04 14:41:11.970 2 9 3
4 2018-10-04 14:43:12.160 2 5 1
7 2018-10-04 14:44:11.970 3 9 3
8 2018-10-04 14:45:12.160 3 5 1
如果需要沒有datetime
的所有列的平均值:
df = df.groupby('Psnr').mean()
print (df)
Speed Torque
Psnr
2 5.5 1.25
3 7.0 2.00
如果只需要日期時間列:
df['dates']= df['Datum_Zeit'].astype(np.int64)
df1 = pd.to_datetime(df.groupby('Psnr')['dates'].mean()).reset_index()
print (df1)
Psnr dates
0 2 2018-10-04 14:40:56.880000000
1 3 2018-10-04 14:44:42.064999936
由於您的數據幀已經按時間排序,您可以通過transform
+ last
計算與數據幀索引對齊的min_time
系列,然后過濾,最后groupby
:
min_times = df.groupby('Psnr')['Datum_Zeit'].transform('last') - pd.Timedelta('5 min')
res = df.loc[df['Datum_Zeit'] > min_times]\
.groupby('Psnr').mean().reset_index()
print(res)
Psnr Speed Torque
0 2 5.5 1.25
1 3 7.0 2.00
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.