例如,我有以下数据框:
Date indicator_1 indicator_2
2013-04-01 03:50:00 x w
2013-04-01 04:00:00 y u
2013-04-01 04:15:00 z v
2013-04-01 04:25:00 x w
2013-04-01 04:25:00 z u
2013-04-01 04:30:00 y u
2013-04-01 04:35:00 y w
2013-04-01 04:40:00 z w
2013-04-01 04:40:00 x u
2013-04-01 04:40:00 y v
2013-04-01 04:50:00 x w
我的目标是使用以下规则创建两列:
第一栏应该告诉我自上次在indicator_1栏上出现“ x”以来的分钟数。
第二列应该告诉我自上次出现在指标_1对上的“ y”和指标_2列上的“ u”以来的分钟数。
对于具有完全相同的小时数且其中一个时间与“ x”(在第一种情况下)或对“ y”,“ u”(在第二种情况下)相对应的行,计算相对于先前出现的变量应设置的分钟数。因此,所需的输出应类似于:
Date desired_column_1 desired_column_2 indicator_1 indicator_2
2013-04-01 03:50:00 NaN NaN x w
2013-04-01 04:00:00 10.0 NaN y u
2013-04-01 04:15:00 25.0 15.0 z v
2013-04-01 04:25:00 35.0 25.0 x w
2013-04-01 04:25:00 35.0 25.0 z u
2013-04-01 04:30:00 5.0 30.0 y u
2013-04-01 04:35:00 10.0 5.0 y w
2013-04-01 04:40:00 15.0 10.0 z w
2013-04-01 04:40:00 15.0 10.0 x u
2013-04-01 04:40:00 15.0 10.0 y v
2013-04-01 04:50:00 10.0 20.0 x w
主要问题是整个数据帧有超过200万行,因此使用循环非常耗时。有什么办法可以实现针对此问题的矢量化方法?
数据框的python代码如下:
d = {'Date': ['2013-04-01 03:50:00','2013-04-01 04:00:00','2013-04-01
04:15:00','2013-04-01 04:25:00','2013-04-01 04:25:00',
'2013-04-01 04:30:00','2013-04-01 04:35:00','2013-04-01 04:40:00','2013-04-01 04:40:00','2013-04-01 04:40:00',
'2013-04-01 04:50:00'], 'indicator_1': ['x','y','z','x','z','y','y','z','x','y','x'],
'indicator_2': ['w','u','v','w','u','u','w','w','u','v','w'],
'desired_column_1': [np.nan, 10, 25, 35, 35,5,10,15,15,15,10],
'desired_column_2': [np.nan, np.nan, 15, 25, 25,30,5,10,10,10,20]}
df = pd.DataFrame(data=d)
答案 0 :(得分:2)
首先确保列$file = file_get_contents('url_provided_by_the_user');
$destinationPath = public_path() . '/location/to/save/'.$filename . '.extension';
file_put_contents($destinationPath, $file);
}
是日期时间对象,并获得一列以表示行与行之间的时间差
['Date']
接下来,为您的条件创建一个分组键。因为我们正在寻找自最后一个x以来的时间,所以我们向下移动了一行,这也可以包括下一个x值。如果不进行移位,我们将不会在组中包括下一个x。
df.Date = pd.to_datetime(df.Date)
df['minD'] = (df.Date -df.Date.shift(1)).astype('timedelta64[m]')
现在通过掩码和mask2 = (df.indicator_1.str.cat(df.indicator_2) == 'yu').cumsum().shift(1)
mask1 = (df.indicator_1 == 'x').cumsum().shift(1)
的微小差异进行分组,但是由于条件尚未发生,因此我们需要过滤掉cumsum()
<1个布尔值,因此应该缺少值时间上的差异。
cumsum()
现在您可以通过向前填充数据来替换这些列中的0值
df['desired_column_1'] = df.groupby(mask1.where(mask1 > 0)).minD.cumsum()
df['desired_column_2'] = df.groupby(mask2.where(mask2 > 0)).minD.cumsum()
这是
df.desired_column_1 = df.desired_column_1.replace(0,method='ffill')
df.desired_column_2 = df.desired_column_2.replace(0,method='ffill')
答案 1 :(得分:0)
router.post('/', formidable(), function (req, res, next) {
res.sendFile(path.resolve(__dirname+'/../public/result.html'), {}, function (err) {
if (err) {
console.log(err);
}
})});