FAQ > 金融建模 > 第三方交互 > Python

Q:天软中如何做两个表的合并(类似python中pandas.merge方法)    

  • A:TSL语言中对于表连接实现已经有非常完整的功能,具体可参考:FAQ:Q:天软表连接的应用(join)
    上述功能是在sql语句中完成的,考虑到有些用户在使用时,希望通过模型来完成此功能,因此,这里做了一个转换处理。
    即,封装模型,通过指定参数方式,实现两个表的合并,类似python中pandas.merge方法。

    在使用之前,用户需先封装模型TSMerge,下载附件导成用户函数附件:TSMerge.fun
    其定义如下:
    定义:TSMerge(leftData:Array,rightData:Array,how:String,left_on:String,right_on:String):Array
    说明:将两个表按指定键(列或索引)合并,支持内连接、外连接、左连接、右连接等。
    参数:
    leftData:数组,左表
    rightData:数组,右表
    how:字符串,指定连接方式,默认为内连接,可选值如下:
      "join":内连接,表示交集,返回两个表中都有匹配的行
      "full join":外连接,表示全集,返回两个表中所有行的并集。
      "left join":左连接,返回左表所有行以及右表中匹配的行
      "right join":右连接,返回右表所有行以及左表中匹配的行
      "cross join":生成笛卡尔积
    left_on: 字符串或整型,左表连接列名,多列用;分隔,若是数字列,则不支持多列
    right_on: 字符串或整型,右表连接列名,多列用;分隔,若是数字列,则不支持多列
    返回:若合并成功则返回合并表,若参数输错,则返回错误提示。
    合并后会产生"_Key"列,表示匹配的索引列,当两表列名相同时,左表加后缀_L,右表加后缀_R

    使用示例:
    示例01:合并匹配列名不一样,且为多列
    Table1:=array(('A':1,'B':2,'C':7),
     ('A':10,'B':3,'C':12),
     ('A':10,'B':10,'C':12),
     ('A':4,'B':20,'C':34),
     ('A':5,'B':10,'C':4));

     Table2:=Array(('G':10,'E':10,'C':3),
     ('G':15,'E':20,'C':3),
     ('G':4,'E':4,'C':20),
     ('G':5,'E':10,'C':3));
     return TSMerge(Table1,Table2,"left join","A;B","G;E");

    返回结果:

    示例02:合并匹配列名一致
    t1:=array(
    ("StockID":"SH000300","date":"2025-11-12","指数涨幅(%)":-0.13),
    ("StockID":"SH000300","date":"2025-11-13","指数涨幅(%)":1.21),
    ("StockID":"SH000300","date":"2025-11-14","指数涨幅(%)":-1.57),
    ("StockID":"SH000300","date":"2025-11-17","指数涨幅(%)":-0.65),
    ("StockID":"SH000300","date":"2025-11-18","指数涨幅(%)":-0.65));
       t2:=array(
    ("StockID":"SH600519","date":"2025-11-12","close":1465.15,"涨幅(%)":0.42),
    ("StockID":"SH600519","date":"2025-11-13","close":1470.38,"涨幅(%)":0.36),
    ("StockID":"SH600519","date":"2025-11-14","close":1456.6,"涨幅(%)":-0.94),
    ("StockID":"SH600519","date":"2025-11-17","close":1471.0,"涨幅(%)":0.99),
    ("StockID":"SH600519","date":"2025-11-18","close":1476.0,"涨幅(%)":0.34));
       return TSMerge(t1,t2,"left join","date");

    返回结果:

    注:使用DeleteColumnByField(t,"date_L;date_R"); 可以删除指定列。