比较具有不同长度非均匀索引的数据帧的列值

2024-09-24 22:22:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个数据帧,如下所示:

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'

但这样一来,我就不知道该如何摆脱那些不必要的争吵。)


Tags: datetimeindextimetypedtvalnanprice
1条回答
网友
1楼 · 发布于 2024-09-24 22:22:39

我发现我可以使用pandas的unstack()来创建tmpOB,而不需要循环,这使得代码更快。在

首先,我必须通过一个多索引来索引dataOB

                          val
Time                hsec     
2013-04-17 09:00:01 0       4
                    1       5
2013-04-17 09:00:02 0       5
                    1       3  
                    2       2
                    3       4
2013-04-17 09:00:03 0       4
                    1       7

(将“hsec”级索引放入此表单需要一些操作,请参见pandas - change values of second level index to display position within first level index

然后,通过

^{pr2}$

相关问题 更多 >