请告诉我问题的标题是否准确--我想我需要一个循环if语句来解决下面的问题--我是Python和一般编程的新手,所以不知道术语是否正确。
我正在使用Spyder,从事一个研究项目。
我需要在现有的数据框架(df)中创建一个新变量,它提供了以下逻辑:
在T3和T4等之间。
按照以上所述,我将根据所有具有1英寸“结果”的行创建数据子集,以供进一步分析。
要重新创建df的一小部分:
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'))其结果应该是:
'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都有一个观察。
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中观察的时间。
我希望这有道理..。
发布于 2019-05-24 15:34:39
这可以通过掩蔽和分组来实现:
# 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)输出是True,False而不是1, NaN
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 Falsehttps://stackoverflow.com/questions/56295157
复制相似问题