繁体   English   中英

在 pandas dataframe 上逐行循环 SQL 查询

[英]Loop a SQL query row by row on a pandas dataframe

我有一个看起来像这样的 dataframe:

time1                              val1     val2    time2
2021-01-20 07:32:39.169390+01:00   john     dale    2021-01-20 15:39:47.429788+01:00
2021-01-20 20:39:18.485783+01:00   anne     mckay   2021-01-20 20:40:17.176882+01:00
2021-01-20 20:45:19.155543+01:00   john     dale    2021-01-20 20:40:17.176882+01:00

我有一个 postgres function 作为输入'time1','val1','val2'和'time2'返回一些输入加上两个额外的列:'val3'和'val4'。

查询将如下所示:

SELECT *
FROM schema.function('val1', 'val2', 'time1', 'time2')

并会返回:

   val1     val2    val3  val4    
   john     dale    28    80
   anne     mckay   45    90
   john     dale    65    110

我的问题是:如何逐行运行 function (或以另一种方式,但考虑到不同的行值作为输入)并将结果与原始 df 合并,以便将这个 df 作为结果?

time1                              val1     val2    time2                             val3  val4
2021-01-20 07:32:39.169390+01:00   john     dale    2021-01-20 15:39:47.429788+01:00  28    80
2021-01-20 20:39:18.485783+01:00   anne     mckay   2021-01-20 20:40:17.176882+01:00  45    90
2021-01-20 20:45:19.155543+01:00   john     dale    2021-01-20 20:40:17.176882+01:00  65    110

到目前为止,我尝试做的是创建一个 function 来检索带有 4 个输入的 f 字符串的查询,如下所示:

def retrieve_val3_val4(time1, val1, val2, time2):
    query = f'''
            SELECT *
            FROM schema.function('{val1}', '{val2}', '{time1}', '{time2}')
            '''
    df = pd.read_sql(query)
    return df
 

然后尝试将 function 应用于 df,如下所示:

df.apply(lambda row: retrieve_val3_val4(row.val1, row.val2, row.time1, row.time2), axis=1)

但这会返回 object 类型而不是 df。

谢谢你的帮助!

使用横向连接。 假设原始行存储在一个表中,那么您可以使用:

select t.*, f.val3, f.val4
from t cross join lateral
     schema.function(t.val1, t.val2, t.time1, t.time2) f;

您还可以使用values来动态构造值:

select t.*, f.val3, f.val4
from (values (?, ?, ?, ?)
     ) v(val1, val2, time1, time2) cross join lateral
     schema.function(v.val1, v.val2, v.time1, v.time2) f;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM