我有两个数据帧,如下所示:
dataOB = pd.DataFrame({'Time': \
[dt.datetime(2013,4,17,9,0,1), \
dt.datetime(2013,4,17,9,0,1), \
dt.datetime(2013,4,17,9,0,2), \
dt.datetime(2013,4,17,9,0,2), \
dt.datetime(2013,4,17,9,0,2), \
dt.datetime(2013,4,17,9,0,2), \
dt.datetime(2013,4,17,9,0,3), \
dt.datetime(2013,4,17,9,0,3)], \
'hsec': [2,54,0,42,60,89,0,10], 'val': [4,5,5,3,2,4,4,7]})
以及
^{pr2}$我需要为dfEq中的每一行分配一个值,该值取决于该行中的价格是否在同一时间戳中dataOB中的'val'值中出现。在
我的第一个解决方案如下所示,并给出了期望的结果。(以下为“然而”。)
dataOB.set_index('Time', inplace=True)
dfEq.set_index('Time', inplace=True)
dfEq['type'] = np.zeros(len(dfEq.index))
tmpOB = pd.DataFrame([dataOB.ix[trTime,'val'] for trTime in dfEq.index], \
index = dfEq.index)
>>> tmpOB
0 1 2 3
Time
2013-04-17 09:00:01 4 5 NaN NaN
2013-04-17 09:00:01 4 5 NaN NaN
2013-04-17 09:00:01 4 5 NaN NaN
2013-04-17 09:00:02 5 3 2 4
2013-04-17 09:00:02 5 3 2 4
2013-04-17 09:00:03 4 7 NaN NaN
2013-04-17 09:00:03 4 7 NaN NaN
2013-04-17 09:00:03 4 7 NaN NaN
2013-04-17 09:00:03 4 7 NaN NaN
[9 rows x 4 columns]
dfEq.type[tmpOB.eq(dfEq.price,axis=0).any(axis=1) & (dfEq.flag=='K')] = 'MBO'
dfEq.type[tmpOB.eq(dfEq.price,axis=0).any(axis=1) & (dfEq.flag=='V')] = 'LSO'
>>> dfEq
price flag type
Time
2013-04-17 09:00:01 4 K MBO
2013-04-17 09:00:01 4 V LSO
2013-04-17 09:00:01 5 V LSO
2013-04-17 09:00:02 3 V LSO
2013-04-17 09:00:02 3 K MBO
2013-04-17 09:00:03 4 K MBO
2013-04-17 09:00:03 5 V 0
2013-04-17 09:00:03 4 K MBO
2013-04-17 09:00:03 5 V 0
[9 rows x 3 columns]
这里的问题是,我有很多这样的数据帧,而且它们都非常大,因此tmpOB的创建在内存和计算时间方面都是不可行的,这是由于列表的理解。在
所以我的问题是:有没有一种方法可以在不需要列表理解或循环的情况下获得相同的结果?也许有一种更直接的方法来比较每一行的价格与'val'中的同期元素?在
(我也试着用pd合并()(在两个数据帧中设置索引之前)类似
mergedDf = pd.merge(dfEq,dataOB,on='Time')
mergedDf['type'] = np.zeros(len(mergedDf.index))
mergedDf.type[(mergedDf.price==mergedDf.val) & \
(mergedDf.flag=='K')] = 'MBO'
mergedDf.type[(mergedDf.price==mergedDf.val) & \
(mergedDf.flag=='V')] = 'LSO'
但这样一来,我就不知道该如何摆脱那些不必要的争吵。)
我发现我可以使用pandas的unstack()来创建tmpOB,而不需要循环,这使得代码更快。在
首先,我必须通过一个多索引来索引dataOB
(将“hsec”级索引放入此表单需要一些操作,请参见pandas - change values of second level index to display position within first level index)
然后,通过
^{pr2}$相关问题 更多 >
编程相关推荐