簡體   English   中英

如何有條件地聚合一個 Pandas dataframe

[英]How to conditionally aggregate a Pandas dataframe

我有一個 dataframe,其中包含一些我要運行模擬的數據。 每行都是一個日期時間和一個值。 由於問題的性質,當值超過某個閾值時,我需要保持 1 小時的原始頻率。 如果不是,我可以對數據重新采樣並在較低頻率數據上運行那部分模擬,以加快模擬速度。

我的想法是以某種方式按天對 dataframe 進行分組(因為我注意到有很多天的值都低於閾值),檢查每個組的最大值,如果最大值低於閾值則匯總數據在該組中轉化為單個平均值。

這是一個最小的工作示例:

import pandas as pd
import numpy as np

threshold = 3

idx = pd.date_range("2018-01-01", periods=27, freq="H")

df = pd.Series(np.append(np.ones(26), 5), index=idx).to_frame("v")
print(df)

Output:

                    v
2018-01-01 00:00:00 1.0
2018-01-01 01:00:00 1.0
2018-01-01 02:00:00 1.0
2018-01-01 03:00:00 1.0
2018-01-01 04:00:00 1.0
2018-01-01 05:00:00 1.0
2018-01-01 06:00:00 1.0
2018-01-01 07:00:00 1.0
2018-01-01 08:00:00 1.0
2018-01-01 09:00:00 1.0
2018-01-01 10:00:00 1.0
2018-01-01 11:00:00 1.0
2018-01-01 12:00:00 1.0
2018-01-01 13:00:00 1.0
2018-01-01 14:00:00 1.0
2018-01-01 15:00:00 1.0
2018-01-01 16:00:00 1.0
2018-01-01 17:00:00 1.0
2018-01-01 18:00:00 1.0
2018-01-01 19:00:00 1.0
2018-01-01 20:00:00 1.0
2018-01-01 21:00:00 1.0
2018-01-01 22:00:00 1.0
2018-01-01 23:00:00 1.0
2018-01-02 00:00:00 1.0
2018-01-02 01:00:00 1.0
2018-01-02 02:00:00 5.0

所需的操作 output 將是這個 dataframe:

                    v
2018-01-01 00:00:00 1.0
2018-01-02 00:00:00 1.0
2018-01-02 01:00:00 1.0
2018-01-02 02:00:00 5.0

其中第一個值是第一天的平均值。

我想我快到了

grouped = df.resample("1D")

for name, group in grouped:
    if group["v"].max() <= 3:
        group['v'].agg("mean")

但我不確定如何實際將聚合應用到所需的組,並獲得 dataframe 返回。

任何幫助是極大的贊賞。

所以我找到了解決方案。

grouped = df.resample("1D")
def conditionalAggregation(x):
    if x['v'].max() <= 3:
        idx = [x.index[0].replace(hour=0, minute=0, second=0, microsecond=0)]
        return pd.DataFrame(x['v'].max(), index=idx, columns=['v'])
    else:
        return x

conditionallyAggregated = grouped.apply(conditionalAggregation)
conditionallyAggregated = conditionallyAggregated.droplevel(level=0)
conditionallyAggregated

這給出了以下 df:

                    v
2018-01-01 00:00:00 1.0
2018-01-02 00:00:00 1.0
2018-01-02 01:00:00 1.0
2018-01-02 02:00:00 5.0

暫無
暫無

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

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