首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >熊猫:连续零值

熊猫:连续零值
EN

Stack Overflow用户
提问于 2016-12-09 03:57:12
回答 2查看 544关注 0票数 1

我有一个像这样的数据框架

代码语言:javascript
复制
Timestamp                     Speed
2014-10-10 00:10:10            112
2014-10-10 00:10:13            34
2014-10-10 00:10:17            0
2014-10-10 00:10:20            0
2014-10-10 00:10:45            0
2014-10-10 00:10:56            3
2014-10-10 00:11:06            0
2014-10-10 00:11:09            0
2014-10-10 00:11:14            11

我希望按连续值(在本例中为0)分组,并具有如下所示的输出

代码语言:javascript
复制
start_time              end_time               number
2014-10-10 00:10:17    2014-10-10 00:10:45     3
2014-10-10 00:11:06    2014-10-10 00:11:09     2
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-12-09 05:49:52

您可以使用.groupby()检查相邻值是否发生变化(即df["Speed"] != df["Speed"].shift()),然后检查每个块中的速度是否为0。也许有一种更好的方法来重新组装最终的DataFrame,但是我只是把结果放到一个列表中,并在最后重新组装它。

您的表在pd.read_clipboard()中读得不太好,所以我只知道时间,但是它应该与实际数据一样工作。

代码语言:javascript
复制
In [113]: df
Out[113]:
           Speed
Timestamp
00:10:10     112
00:10:13      34
00:10:17       0
00:10:20       0
00:10:45       0
00:10:56       3
00:11:06       0
00:11:09       0
00:11:14      11

In [114]: l = []

In [115]: for k, v in df.groupby((df["Speed"] != df["Speed"].shift()).cumsum()):
     ...:     if v["Speed"].iloc[0] == 0:
     ...:         l.append({'start_time': v.index.min(), 'end_time': v.index.max(), 'number': len(v)})
     ...: pd.DataFrame(l, columns=['start_time', 'end_time', 'number'])
     ...:
Out[115]:
  start_time  end_time  number
0   00:10:17  00:10:45       3
1   00:11:06  00:11:09       2
票数 1
EN

Stack Overflow用户

发布于 2016-12-09 07:17:54

这里有一个非循环实现

代码语言:javascript
复制
s = (((df['speed'] == 0) & (df['speed'].shift(1) == 0)) | ((df['speed'] == 0) & (df['speed'].shift(-1) == 0)) ) * 1
s1 = s.diff()
group_labels = s1[s1 == 1].cumsum()
s_nan = s.replace(1, np.nan)
df_copy = df.copy()
df_copy['label'] = s_nan.combine_first(group_labels).fillna(method='ffill').replace(0, np.nan)
df_copy = df_copy.groupby('label')['timestamp'].agg({'start_time':'first', 'end_time':'last', 'number':'size'})
df_copy = df_copy[['start_time', 'end_time', 'number']].reset_index(drop=True)

df_copy

            start_time             end_time  number
0  2014-10-10 00:10:17  2014-10-10 00:10:45       3
1  2014-10-10 00:11:06  2014-10-10 00:11:09       2
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41052838

复制
相关文章

相似问题

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