首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >熊猫-带滑动窗口的条件柱

熊猫-带滑动窗口的条件柱
EN

Stack Overflow用户
提问于 2019-05-17 10:46:22
回答 1查看 265关注 0票数 2

我有一个有两列的df --时间戳和文本。我试图用True/false (1/0)标签标记数据。条件是,如果文本中存在"error“一词,则在输入之前3-4小时内的所有条目都应该得到一个标签,而其他条目则为0。例如:像这样的df:

代码语言:javascript
运行
复制
time   text
15:00  a-ok
16:01  fine
17:00  kay
18:00  uhum
19:00  doin well
20:00  is error
20:05  still error
21:00  fine again

应转化为:

代码语言:javascript
运行
复制
time   text       error coming
15:00  a-ok       0
16:01  fine       1
17:00  kay        1
18:00  uhum       1
19:00  doin well  1
20:00  is error   0
20:05  still error0
21:00  fine again 0

我读到了一些关于用.rolling滑动窗口的东西,但是我很难把它们整合在一起。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-17 11:03:14

其思想是将时间转换为timedeltas,过滤带有错误的时间差,并为每个值创建带有logical_or.reduce的掩码,使用反向m1的链掩码以避免error的值,并将True/False转换为1/0映射的整数:

代码语言:javascript
运行
复制
td = pd.to_timedelta(df['time'].astype(str) + ':00')

m1 = df['text'].str.contains('error')
v = td[m1]
print (v)
5   20:00:00
6   20:05:00
Name: time, dtype: timedelta64[ns]

m2 = np.logical_or.reduce([td.between(x - pd.Timedelta(4, unit='h'), x) for x in v])
df['error coming'] = (m2 & ~m1).astype(int)
print (df)
    time         text  error coming
0  15:00         a-ok             0
1  16:01         fine             1
2  17:00          kay             1
3  18:00         uhum             1
4  19:00    doin well             1
5  20:00     is error             0
6  20:05  still error             0
7  21:00   fine again             0

编辑:

代码语言:javascript
运行
复制
df['time'] = pd.to_datetime(df['time'])
print (df)
                 time         text
0 2019-01-26 15:00:00         a-ok
1 2019-01-26 16:01:00         fine
2 2019-01-26 17:00:00          kay
3 2019-01-26 18:00:00         uhum
4 2019-01-26 19:00:00    doin well
5 2019-01-26 20:00:00     is error
6 2019-01-26 20:05:00  still error
7 2019-01-26 21:00:00   fine again

print (df.dtypes)
time    datetime64[ns]
text            object
dtype: object
代码语言:javascript
运行
复制
m1 = df['text'].str.contains('error')
v = df.loc[m1, 'time']
print (v)
5   2019-01-26 20:00:00
6   2019-01-26 20:05:00
Name: time, dtype: datetime64[ns]

m2 = np.logical_or.reduce([df['time'].between(x - pd.Timedelta(4, unit='h'), x) for x in v])
df['error coming'] = (m2 & ~m1).astype(int)
print (df)
                 time         text  error coming
0 2019-01-26 15:00:00         a-ok             0
1 2019-01-26 16:01:00         fine             1
2 2019-01-26 17:00:00          kay             1
3 2019-01-26 18:00:00         uhum             1
4 2019-01-26 19:00:00    doin well             1
5 2019-01-26 20:00:00     is error             0
6 2019-01-26 20:05:00  still error             0
7 2019-01-26 21:00:00   fine again             0

矢量化溶液:

代码语言:javascript
运行
复制
m1 = df['text'].str.contains('error')
v = df.loc[m1, 'time']
print (v)
5   2019-01-26 20:00:00
6   2019-01-26 20:05:00
Name: time, dtype: datetime64[ns]

a = v - pd.Timedelta(4, unit='h')
m = (a.values < df['time'].values[:, None]) & (v.values > df['time'].values[:, None])
df['error coming'] = (m.any(axis=1) & ~m1).astype(int)
print (df)
                 time         text  error coming
0 2019-01-26 15:00:00         a-ok             0
1 2019-01-26 16:01:00         fine             1
2 2019-01-26 17:00:00          kay             1
3 2019-01-26 18:00:00         uhum             1
4 2019-01-26 19:00:00    doin well             1
5 2019-01-26 20:00:00     is error             0
6 2019-01-26 20:05:00  still error             0
7 2019-01-26 21:00:00   fine again             0
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56184859

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档