随着时间的推移,使用熊猫计算滚动窗口中唯一 id 的特定条件事件的数量

Posted

技术标签:

【中文标题】随着时间的推移,使用熊猫计算滚动窗口中唯一 id 的特定条件事件的数量【英文标题】:Count number of a specific conditional event for unique id in a rolling window over time with pandas 【发布时间】:2021-12-11 12:45:33 【问题描述】:

我有第一个 DataFrame,我想用新的列计数器获得第二个。

逻辑:使用滚动窗口(例如 df.rolling('1min').agg(lambda ...)), 对于窗口中的每个唯一 ID,如果至少一次找到“完整”或“部分”,则“计数器”列为 1。一旦第一次找到,我们就写1,我们不需要在窗口中进一步检查。

例如,下面的 id '2' 在同一个窗口中有两倍的 'partial event',因此计数器为 0。

计数器始终为 0 或 1。

请注意,我们应该忽略列事件中除“完整”和“部分”之外的其他事件。

timestamp                id  event    
2021-10-26 10:00:00.000  1   full     
2021-10-26 10:00:01.000  2   partial  
2021-10-26 10:00:03.090  3   full     
2021-10-26 10:00:05.090  2   partial  
2021-10-26 10:00:05.590  4   event_z
2021-10-26 10:00:05.690  4   event_z
2021-10-26 10:00:05.790  4   event_b


timestamp                id  event    counter
2021-10-26 10:00:00.000  1   full     1
2021-10-26 10:00:01.000  2   partial  1
2021-10-26 10:00:03.090  3   full     1
2021-10-26 10:00:05.090  2   partial  0
2021-10-26 10:00:05.090  4   event_z  0
2021-10-26 10:00:05.090  4   event_z  0
2021-10-26 10:00:05.090  4   event_b  0

df['counter'].rolling('1min').agg(lambda ... ?)

我很难将一个复杂的公式写成 lambda 函数,也许最好将问题分成两部分并创建中间列?

提前致谢!

【问题讨论】:

【参考方案1】:

IIUC 使用:

m = df['event'].isin(['full','partial'])
df.loc[m, 'new'] = pd.factorize(df.loc[m, 'event'])[0]

def f(x):
    a = x.duplicated() & x.notna()
    return ~a.any()
df = df.groupby('id')['new'].rolling('1min').apply(f).fillna(0).reset_index(level=0).sort_index()
print (df)
                         id  new
timestamp                       
2021-10-26 10:00:00.000   1  1.0
2021-10-26 10:00:01.000   2  1.0
2021-10-26 10:00:03.090   3  1.0
2021-10-26 10:00:05.090   2  0.0
2021-10-26 10:00:05.590   4  0.0
2021-10-26 10:00:05.690   4  0.0
2021-10-26 10:00:05.790   4  0.0

【讨论】:

非常感谢 jezrael 的提议。我认为这可能行不通,因为除了“部分”和“完整”之外还有其他类型的事件。我说的对吗? @LaGabriella - 嗯,这意味着不了解您的功能,您能否在示例数据中添加更多行以解释我的解决方案失败的原因? @LaGabriella - 换句话说 - 需要测试是否仅重复 fullpartial 然后设置 0 否则 1 ? 我刚刚完成了我的问题。我的错,它没有明确指定。如果至少一次找到“full”或“partial”,则“counter”列为 1。一旦第一次找到,我们写1,我们不需要在窗口中进一步检查。 再次感谢您!我会试试这个。关于最后一个表, id2 的最后两个值应该是 0 而不是 1 。也许是错字?

以上是关于随着时间的推移,使用熊猫计算滚动窗口中唯一 id 的特定条件事件的数量的主要内容,如果未能解决你的问题,请参考以下文章

使用 pandas 的滚动窗口计算一天中每个时间的平均值

熊猫数据框,对滚动窗口中的任何列进行计算

熊猫滚动适用于可变窗口长度

使用窗口函数计算滚动计数

随着时间的推移重复条目计数不同

随着时间的推移滑动窗口 - 数据结构和垃圾收集