[英]compare column values of dataframes with non-unique indices of different length
我有两个数据帧,如下所示:
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]})
和
dfEq = 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,1), \
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), \
dt.datetime(2013,4,17,9,0,3), \
dt.datetime(2013,4,17,9,0,3)], \
'price': [4,4,5,3,3,4,5,4,5], \
'flag': ['K','V','V','V','K','K','V','K','V']})
我需要为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.merge()(在两个数据帧中设置索引之前)
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'
但是后来我不知道如何再次摆脱不必要的行。)
我发现可以使用熊猫的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- 更改第二级索引的值以显示第一级索引内的位置 )
然后,通过
dataOB.unstack('hsec')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.