【问题标题】:Finding difference within grouped dataframe in python在 python 中的分组数据框中查找差异
【发布时间】:2022-01-12 08:53:16
【问题描述】:

我有这个数据框:

                           Value      ID
          Timestamp
-----------------------------------------
2018-07-03 02:19:28          45      111
2018-07-03 02:19:29          36      111
2018-07-03 02:19:30          64      111
2018-07-03 02:19:31          35      111
2018-07-03 02:19:32          22      111 
...            
2018-07-03 03:43:14          35      232 
2018-07-03 03:43:15          44      232
2018-07-03 03:43:16          64      232
2018-07-03 03:43:17          44      232
2018-07-03 03:43:18          64      232
...
2018-07-03 05:20:28          35      555
2018-07-03 05:21:28          44      555
2018-07-03 05:22:28          75      555 
2018-07-03 05:19:28          84      555
2018-07-03 05:19:28          35      555 
...

在这里,每个 ID 代表整个数据集的不同“子集”。所以 ID 111 是它自己的时间序列数据集,232 是它自己的时间序列数据集,而 555 是它自己的时间序列数据集,还有很多没有显示。我想要做的是,使用 python,对于这些数据子集中的每一个,根据“值”列中的值找到峰值和谷值的数量,然后将其附加到原始数据框中,如下所示:

                          Value      ID       Curve_Changes
          Timestamp
------------------------------------------------------------
2018-07-03 02:19:28          45      111                  4
2018-07-03 02:19:29          36      111                  4
2018-07-03 02:19:30          64      111                  4
2018-07-03 02:19:31          35      111                  4
2018-07-03 02:19:32          22      111                  4  
...             
2018-07-03 03:43:14          35      232                  9    
2018-07-03 03:43:15          44      232                  9
2018-07-03 03:43:16          64      232                  9
2018-07-03 03:43:17          44      232                  9
2018-07-03 03:43:18          64      232                  9
...
2018-07-03 05:20:28          35      555                 12
2018-07-03 05:21:28          44      555                 12
2018-07-03 05:22:28          75      555                 12 
2018-07-03 05:19:28          84      555                 12
2018-07-03 05:19:28          35      555                 12 
...

基于这个理想的输出示例数据框,这意味着如果您要绘制对应于 ID 111 的时间序列数据子集,您会看到 4 条曲线变化(无论是峰值还是谷值),如果您要绘制ID 232 对应的时间序列数据子集,您会看到 9 条曲线变化(无论是峰还是谷)等

我正在尝试使用此代码来查找峰谷数:

slopes = df["Value"].diff().bfill()
signs = slopes > 0
changes = signs.astype(float).diff(periods=-1).fillna(0)
num_changes = changes.abs().sum()

num_changes 是我想要的曲线变化次数。我能够让它在整个数据帧上工作,但我很困惑如何让它为每个单独的时间序列数据子集工作,以产生我上面显示的理想输出示例数据帧。我不确定这应该如何组织,但我认为这将是一个.groupby() 类型的任务,我认为我需要对“ID”列进行“分组”,但我不确定。如何按数据子集按数据帧分组,并找到每个子集的曲线变化次数并将其与原始数据帧匹配?

【问题讨论】:

    标签: python pandas dataframe subset curve


    【解决方案1】:

    在此处使用GroupBy.transform 将每个组的解决方案应用于新列:

    def f(x):
        #for debug
        print (x)
        slopes = x.diff().bfill()
        #for debug
        print (slopes)
        signs = slopes > 0
        changes = signs.astype(float).diff(periods=-1).fillna(0)
        return changes.abs().sum()
    
    df['Curve_Changes'] = df.groupby('ID')['Value'].transform(f)
    

    【讨论】:

    • 谢谢,这运行没有错误,并以正确的格式生成了我想要的输出数据帧,但由于某种原因,Curve_Changes 列都是NaN 值。我不知道这是怎么发生的,因为我可以成功地找到整个数据帧上“值”值的曲线变化次数,而忽略“ID”。
    • @LostinSpatialAnalysis - 嗯,很难的问题。是否存在具有 2 个或更多值的组,例如 sample ?尝试调试代码,可能发现问题。
    • 啊,没关系,我没有意识到你已经更新了你的建议,那里。您当前的代码建议有效,成功!谢谢!
    猜你喜欢
    • 1970-01-01
    • 2019-06-19
    • 1970-01-01
    • 2018-03-20
    • 2015-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-09
    相关资源
    最近更新 更多