给定两个dataframes df_1和df_2如何加入他们的行列,使得datetime列df_1是介于两者之间start,并end 在数据帧df_2:
print df_1
timestamp A B
0 2016-05-14 10:54:33 0.020228 0.026572
1 2016-05-14 10:54:34 0.057780 0.175499
2 2016-05-14 10:54:35 0.098808 0.620986
3 2016-05-14 10:54:36 0.158789 1.014819
4 2016-05-14 10:54:39 0.038129 2.384590
print df_2
start end event
0 2016-05-14 10:54:31 2016-05-14 10:54:33 E1
1 2016-05-14 10:54:34 2016-05-14 10:54:37 E2
2 2016-05-14 10:54:38 2016-05-14 10:54:42 E3
Run Code Online (Sandbox Code Playgroud)
获取相应的event位置和df1.timestamp之间df_2.startdf2.end
timestamp A B event
0 2016-05-14 10:54:33 …Run Code Online (Sandbox Code Playgroud) 我需要在标识符和条件上合并两个pandas数据帧,其中一个数据帧中的日期在另一个数据帧中的两个日期之间.
Dataframe A有一个日期("fdate")和一个ID("cusip"):

我需要将此与此数据帧B合并:

在A.cusip==B.ncusip和A.fdate之间B.namedt和B.nameenddt.
在SQL中这将是微不足道的,但我能看到如何在pandas中执行此操作的唯一方法是首先在标识符上无条件合并,然后在日期条件上进行过滤:
df = pd.merge(A, B, how='inner', left_on='cusip', right_on='ncusip')
df = df[(df['fdate']>=df['namedt']) & (df['fdate']<=df['nameenddt'])]
Run Code Online (Sandbox Code Playgroud)
这真的是最好的方法吗?似乎如果可以在合并中进行过滤以避免在合并之后但在过滤器完成之前具有可能非常大的数据帧,则会好得多.
我经常使用范围条件将pandas用于合并(join).
例如,如果有2个数据帧:
A(A_id,A_value)
B(B_id,B_low,B_high,B_name)
它们很大并且大小相同(比如每个2M记录).
我想在A和B之间建立一个内连接,所以A_value将在B_low和B_high之间.
使用SQL语法:
SELECT *
FROM A,B
WHERE A_value between B_low and B_high
Run Code Online (Sandbox Code Playgroud)
这将非常简单,简短而有效.
同时在pandas中唯一的方法(不使用我发现的循环)是在两个表中创建一个虚拟列,连接它(相当于交叉连接),然后过滤掉不需要的行.这听起来沉重而复杂:
A['dummy'] = 1
B['dummy'] = 1
Temp = pd.merge(A,B,on='dummy')
Result = Temp[Temp.A_value.between(Temp.B_low,Temp.B_high)]
Run Code Online (Sandbox Code Playgroud)
我的另一个解决方案是通过使用B[(x>=B.B_low) & (x<=B.B_high)]掩码在B上的每个A值上应用搜索函数,但它听起来效率低,并且可能需要索引优化.
是否有更优雅和/或更有效的方式来执行此操作?