Python 合并两个表

Python 合并两个表,python,pandas,oracle,Python,Pandas,Oracle,我有两个表,一个表有FROM_SERIAL,TO_SERIAL和TRANSACTION_DATE。另一个表有序列号和激活日期。我想在特定范围内合并这两个表 例如: 第一桌 FROM_SERIAL TO_SERIAL TRANSACTION_DATE 10003000100 10003000500 22-APR-19 10003001100 10003001300 25-MAY-19 1000500200

我有两个表,一个表有FROM_SERIAL,TO_SERIAL和TRANSACTION_DATE。另一个表有序列号和激活日期。我想在特定范围内合并这两个表

例如:

第一桌

   FROM_SERIAL        TO_SERIAL       TRANSACTION_DATE
   10003000100        10003000500     22-APR-19
   10003001100        10003001300     25-MAY-19
   10005002001        10005002500     30-AUG-19
第二桌

   SERIAL_NO        ACTIVATION_DATE
   10003000150      30-APR-19
   10005002300      01-OCT-19
期望表

   FROM_SERIAL        TO_SERIAL       SERIAL_NO       ACTIVATION_DATE
   10003000100        10003000500     10003000150      30-APR-19
   10005002001        10005002500     10005002300      01-OCT-19
我想在上述场景中合并这两个表

代码可能是Oracle或Python,这无关紧要。

考虑:

SELECT 
    t1.from_serial, 
    t1.to_serial,
    t2.serial_no,
    t2.activation_date
FROM table1 t1
INNER JOIN table2 t2 
    ON t2.serial_no >= t1.from_serial AND t2.serial_no < t1.to_serial
你可以随心所欲地修正这些不平等。请注意,如果表2中的给定序列号属于表1中的多个范围,它们将全部匹配,并且您将在结果集中获得重复的表1记录。

使用中间连接

熊猫解决方案:

df = df1.assign(a=1).merge(df2.assign(a=1), on='a', how='outer')

df = df[df['SERIAL_NO'].between(df['FROM_SERIAL'], df['TO_SERIAL'])]
df = df.drop(['a','TRANSACTION_DATE'], 1)
print (df)
   FROM_SERIAL    TO_SERIAL    SERIAL_NO ACTIVATION_DATE
0  10003000100  10003000500  10003000150       30-APR-19
5  10005002001  10005002500  10005002300       01-OCT-19

但如果大数据更好,请使用oracle解决方案。

您也可以使用如下所示的numpy广播功能。评论中的解释

df1=pd.数据帧['100030001000','10003000500','19年4月22日','10003001100','10003001300','19年5月25日','10005002001','10005002500','19年8月30日'],列='FROM_SERIAL','TO_SERIAL','TRANSACTION_DATE' df2=df=pd.DataFrame['10003000150','19年4月30日','10005002300','19年10月1日'],columns='SERIAL\u NO','ACTIVATION\u DATE' “df1[[FROM_SERIAL]]是大小为m的列向量,“df2[SERIAL_NO].values”是行向量 大小为n的向量然后进行宽投射将生成形状为m的数组,n为 比较每对m和n的结果 比较=df1[[从序列号]]。值DF2[序列号]。值 掩码=np.arangelendf1*lendf2.Reformate-1,lendf2[比较] pd.concat[df1.iloc[mask//lendf2]。重置_indexdrop=True,df2.iloc[mask%lendf2]。重置_indexdrop=True],axis=1,sort=False
请参阅pandas.merge我尝试了您的代码,但它没有正确匹配,我认为这是一个错误Transpose@ShulazShan很抱歉,我的错误,索引仅适用于已排序的数据,我现在已更正代码
df = df1.assign(a=1).merge(df2.assign(a=1), on='a', how='outer')

df = df[df['SERIAL_NO'].between(df['FROM_SERIAL'], df['TO_SERIAL'])]
df = df.drop(['a','TRANSACTION_DATE'], 1)
print (df)
   FROM_SERIAL    TO_SERIAL    SERIAL_NO ACTIVATION_DATE
0  10003000100  10003000500  10003000150       30-APR-19
5  10005002001  10005002500  10005002300       01-OCT-19