随着时间的推移,使用熊猫计算滚动窗口中唯一 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 - 换句话说 - 需要测试是否仅重复full
或 partial
然后设置 0 否则 1 ?
我刚刚完成了我的问题。我的错,它没有明确指定。如果至少一次找到“full”或“partial”,则“counter”列为 1。一旦第一次找到,我们写1,我们不需要在窗口中进一步检查。
再次感谢您!我会试试这个。关于最后一个表, id2 的最后两个值应该是 0 而不是 1 。也许是错字?以上是关于随着时间的推移,使用熊猫计算滚动窗口中唯一 id 的特定条件事件的数量的主要内容,如果未能解决你的问题,请参考以下文章