首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >来自循环if语句的子集熊猫timeseries数据

来自循环if语句的子集熊猫timeseries数据
EN

Stack Overflow用户
提问于 2019-05-24 14:58:37
回答 1查看 55关注 0票数 1

请告诉我问题的标题是否准确--我想我需要一个循环if语句来解决下面的问题--我是Python和一般编程的新手,所以不知道术语是否正确。

我正在使用Spyder,从事一个研究项目。

我需要在现有的数据框架(df)中创建一个新变量,它提供了以下逻辑:

  • 在time T1 (e1列中数字1的第一次出现)和time T2 (e1中的第2次1)之间,如果在任何变量(e2或e3)的T1和T2之间记录了1,或者T1和T2之间的v1值大于1,那么在T1和T2之间的一个名为'result‘的新列中放置一个1。
  • 在time T2 (e1列中数字1的第二次出现)和time T3 (e1中的第3次出现)之间,如果在任何变量(e2或e3)的T2和T3之间记录了1,或者T2和T3之间的v1值大于1,那么在T2和T3之间的一个名为'result‘的新列中放置一个1。

在T3和T4等之间。

按照以上所述,我将根据所有具有1英寸“结果”的行创建数据子集,以供进一步分析。

要重新创建df的一小部分:

代码语言:javascript
运行
复制
import pandas as pd
import numpy as np
import datetime


df = pd.DataFrame({'e1' : [1,np.nan,np.nan,1,np.nan,1,np.nan,np.nan,1,np.nan,np.nan,1,np.nan],
                    'e2' : [np.nan,1,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan],
                    'e3' : [np.nan,np.nan,np.nan,np.nan,1,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan],
                    'v1' : [1,1,1,1,1,1,1,1,1,1.2,1.5,1,1],},
                        index=pd.date_range('2019-05-02T00:00:00', '2019-05-02T01:00:00', freq='5T'))

其结果应该是:

代码语言:javascript
运行
复制
'result' : [1,1,1,1,1,np.nan,np.nan,np.nan,np.nan,1,1,np.nan,np.nan]

我希望这是合理的。

谢谢!

编辑31.05.2019

然而,在大多数情况下,所建议的解决方案在关键方面失败了:

我已经编辑了示例数据以包含一个实例,其中e1和e2在00:25:00都有一个观察。

代码语言:javascript
运行
复制
import pandas as pd
import numpy as np
import datetime

df = pd.DataFrame({'e1' : [1,np.nan,np.nan,1,np.nan,1,np.nan,np.nan,1,np.nan,np.nan,1,np.nan],
                    'e2' : [np.nan,1,np.nan,np.nan,np.nan,1,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan],
                    'e3' : [np.nan,np.nan,np.nan,np.nan,1,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan]},
                        index=pd.date_range('2019-05-02T00:00:00', '2019-05-02T01:00:00', freq='5T'))

The issue

我遇到的问题是,建议的解决方案是在00:25:00到00:40:00之间报告一个结果,我希望结果不包括这个结果。我想要代码分析列e1中1之间的时间,不包括e1中观察的时间。

我希望这有道理..。

EN

Stack Overflow用户

发布于 2019-05-24 15:34:39

这可以通过掩蔽和分组来实现:

代码语言:javascript
运行
复制
# if there is an event at that time
events = df[['e2','e3']].notna().any(axis=1)

# if v1 > 1 at given time
v1g1 = df['v1'].gt(1)

# mask
mask = v1g1 | events

# group the events by e1 
df['result'] = mask.groupby(df.e1.fillna(0).cumsum()).transform('any')

# if you want 1 and NaN:
df['result'] = np.where(mask.groupby(df.e1.fillna(0).cumsum()).transform('any'),
                        1, np.nan)

输出是TrueFalse而不是1, NaN

代码语言:javascript
运行
复制
                        e1      e2      e3      v1      result
2019-05-02 00:00:00     1.0     NaN     NaN     1.0     True
2019-05-02 00:05:00     NaN     1.0     NaN     1.0     True
2019-05-02 00:10:00     NaN     NaN     NaN     1.0     True
2019-05-02 00:15:00     1.0     NaN     NaN     1.0     True
2019-05-02 00:20:00     NaN     NaN     1.0     1.0     True
2019-05-02 00:25:00     1.0     NaN     NaN     1.0     False
2019-05-02 00:30:00     NaN     NaN     NaN     1.0     False
2019-05-02 00:35:00     NaN     NaN     NaN     1.0     False
2019-05-02 00:40:00     1.0     NaN     NaN     1.0     True
2019-05-02 00:45:00     NaN     NaN     NaN     1.2     True
2019-05-02 00:50:00     NaN     NaN     NaN     1.5     True
2019-05-02 00:55:00     1.0     NaN     NaN     1.0     False
2019-05-02 01:00:00     NaN     NaN     NaN     1.0     False
票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56295157

复制
相关文章

相似问题

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