【问题标题】:Set column value in each first matched row to 0将每个第一个匹配行中的列值设置为 0
【发布时间】:2020-05-15 11:01:48
【问题描述】:

我正在尝试检测时间戳之间的差异低于某个阈值的时间序列。为此,我将时间戳列表转换为秒,并测量每个时间戳之间的差异。我已经编写了代码来执行此操作,但问题是当我测量天之间的差异时,每天第一行的时间差值应该为零。所以下面数据框中的值86390 应该是0。这只是一个人为的例子。多组如何将每组的第一个条目设置为0?

代码:

import pandas as pd

arr= []
df = pd.DataFrame(
    {'date': ['2019-01-01 00:02:48.714000' , '2019-01-01 00:02:58.714000' , '2019-01-02 00:02:48.714000' , '2019-01-02 00:04:48.714000'],
     'id': [1 , 2 , 3 , 4],

    })
df['date'] = pd.to_datetime(df['date'])

for d in df['date'] : 
    arr.append(d.timestamp())

df.sort_values(by=['date'])
df['TIME_IN_SEC'] = arr
df['TIME_IN_SEC_SHIFT'] = df.TIME_IN_SEC.shift(1)
df['TIME_DIFF'] = df["TIME_IN_SEC"] - df["TIME_IN_SEC_SHIFT"]

list_values = []

for g in df.groupby(pd.Grouper(key='date',freq='D')) : 
    list_values.append(sum(g[1]['TIME_DIFF']) / len(g[1]))

df

渲染:

【问题讨论】:

    标签: python pandas jupyter-notebook time-series jupyter


    【解决方案1】:

    要将每天的第一行设置为零,您可以按日期列分组但提取实际日期值,然后聚合到“第一”行。从此为“id”列创建一个系列。 (我假设它们是唯一值。)

    id_filt = df.groupby(df.date.dt.date).first()['id']
    

    然后使用 loc 仅返回具有 'id' 值的行,然后将列设置为零。

    df.loc[df["id"].isin(id_filt.values), ["TIME_IN_SEC_SHIFT", "TIME_DIFF"]] = 0
    
                         date  id   TIME_IN_SEC  TIME_IN_SEC_SHIFT  TIME_DIFF
    0 2019-01-01 00:02:48.714   1  1.546301e+09       0.000000e+00        0.0
    1 2019-01-01 00:02:58.714   2  1.546301e+09       1.546301e+09       10.0
    2 2019-01-02 00:02:48.714   3  1.546387e+09       0.000000e+00        0.0
    3 2019-01-02 00:04:48.714   4  1.546387e+09       1.546387e+09      120.0
    

    当然你可以将它们组合在一起得到:

    df.loc[
        df["id"].isin(df.groupby(df.date.dt.date).first()["id"].values),
        ["TIME_IN_SEC_SHIFT", "TIME_DIFF"],
    ] = 0
    

    【讨论】:

      猜你喜欢
      • 2021-07-24
      • 2022-09-27
      • 2020-03-03
      • 2015-07-05
      • 2022-08-12
      • 2021-10-16
      • 1970-01-01
      • 2022-01-25
      • 1970-01-01
      相关资源
      最近更新 更多