python - 基于前一行的计算( Pandas )

标签 python pandas logging time

我正在尝试为某些日志数据创建一个事件计数器和自第一个事件计数器以来的天数。下面的 DataFrame 跟踪某个事件是否每天都发生在一个组中。对于每个组,我需要计算任何日期之前和该日期发生的事件数。我还需要计算每个组中第一个事件发生后的天数

开始DF

group        date  event
    A  2020-07-16       0
    A  2020-07-17       1
    A  2020-07-18       0
    A  2020-07-19       1
    A  2020-07-20       0
    A  2020-07-21       0
    A  2020-07-22       1
    B  2020-07-16       1
    B  2020-07-17       1
    B  2020-07-18       0
    B  2020-07-19       1
    B  2020-07-20       0
    B  2020-07-21       1
    B  2020-07-22       1

生成DF的代码

import pandas as pd
import datetime as datetime
base = datetime.datetime.today()
numdays = 7
date_list = [(base - datetime.timedelta(days=x)).date() for x in range(numdays)]

df = pd.DataFrame(columns=['group', 'date'])
for group in ['A', 'B']:
    tmp = pd.DataFrame({'group': group, 'date': date_list})
    df = df.append(tmp)
df = df.sort_values(['group', 'date'])

groupA_events = [0, 1, 0, 1, 0, 0, 1]
groupB_events = [1, 1, 0, 1, 0, 1, 1]
events = groupA_events + groupB_events
df['event'] = events

结束DF

group        date  event  counter  since_first
    A  2020-07-16      0         0            0
    A  2020-07-17      1         1            0
    A  2020-07-18      0         1            1
    A  2020-07-19      1         2            2
    A  2020-07-20      0         2            3
    A  2020-07-21      0         2            4
    A  2020-07-22      1         3            5
    B  2020-07-16      1         1            0
    B  2020-07-17      1         2            1
    B  2020-07-18      0         2            2
    B  2020-07-19      1         3            3
    B  2020-07-20      0         3            4
    B  2020-07-21      1         4            5
    B  2020-07-22      1         5            6

我的数据大约有 80 万行(并且还在增长)。我找到了一个可行(有点)但执行时间极长的解决方案。

最佳答案

您可以使用 cumsum + cumcount 执行 groupby

df['counter']=df.groupby('group').event.cumsum()
df['since_first']=df[df['counter'].ne(0)].groupby('group')['counter'].cumcount()
df['since_first'].fillna(0, inplace=True)

关于python - 基于前一行的计算( Pandas ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63044633/

相关文章:

svn - 在具有多个路径的两个修订之间获取日志消息

python - Pathlib Path.rename() 创建中间目录的方式?

python - 如何一步退出并运行Python IDLE shell

python - 过滤 Pandas 行,其中列中的第一个字母是/不是某个值

python - 获取上一行的值并计算新列 pandas python

grails - 如何使用 Log4J 禁用来自不同模块的日志记录,例如阻止 'Resources' 的日志

python - 如何在没有回车的情况下在 Python 3.3.3 中打印?

python - django 缓存 session

python - 如何检查 DataFrame 列值是否存在于多个列表中的任何一个中,如果不存在,则填充另一列?

logging - 为什么我的 MongoDB 日志填满 "getmore local.oplog.rs"?