【问题标题】:Dynamic SQL Query based on pandas dataframe Values基于 pandas 数据框值的动态 SQL 查询
【发布时间】:2020-10-20 09:43:33
【问题描述】:

我面临以下问题。

我有一个数据框,其中包含:ID、日期、previous_date。

我还有一个存储在 SQL Server 数据库中的表,其中包含 ID、日期、值,我想实现以下目标:

在 db 表的数据框中搜索每个 ID,并在名为 desired_value 的新列中返回日期和上一个日期之间出现的值的总和。

起始数据帧

ID  Date    previous_date   desired_value
5   15/3/2020   15/1/2020   16
7   25/6/2019   19/5/2019   8

数据库表

ID  Date    Value
 5  13/1/2020   5
 5  16/1/2020   7
 5  17/2/2020   9
 7  21/5/2019   4
 7  17/6/2019   4

尽我所能,查询必须循环执行,对于起始数据帧的每一行。

我脑子里有这样的东西

my_query = "select ID, sum(Value) from db_table WHERE ID in {}".format(tuple(df['ID']))

但是如何在里面传递日期的参数呢?

或者这个

for index,row in left.iterrows():
x = cursor.execute('''
            SELECT [ID], SUM([Value]) FROM db.table
            WHERE Date > ? AND Date < ?
            GROUP BY ID
        ''',row['Date'],row['previous_date']
        )

但是 x 将是一个光标对象...

注意:Pandas 数据框和 db 表多次包含不同日期的相同 id(想象一下,就像每个 id 的订单)。

谢谢。

【问题讨论】:

  • 嗨,欢迎来到 stackoverflow。请不要发布您预期结果的图片,图片只能在无法通过文字表达的情况下作为最后的手段。这样你会得到更多的帮助。其次,stackoverflow 不是“编写我的代码”/外包服务。如果您遇到问题或不了解某个特定方面,请对此进行解释。但是展示你已经尝试过的东西,然后人们可以帮助你。有关更多指针,请参阅此链接:How-to-ask
  • 感谢您的反馈@DKramer。我删除了图像并用文字描述了问题。关于解决方案,我不清楚实现这一目标的最佳方法是什么,我只是觉得我必须遍历每一行的数据框。

标签: python pandas


【解决方案1】:

在我看来,您正在尝试根据数据框中的条件对数据库中的 Value 列进行累积总和。因此,假设您已将数据库读入名为 database_df 的数据帧,并假设您的起始数据帧尚未包含所需的值 starting_df,您可以执行以下操作

starting_df = starting_df.merge(database_df, on=["id"])
starting_df = starting_df.loc[(starting_df.date > starting_df.previous_date) 
                              & (starting_df.date <= starting_df.Date),:]
starting_df = starting_df.groupby(by=["id", "Date", "previous_date"]).sum()

结果框架将是一个DataFrameGroupBy 对象,如下所示。如果需要,我让你看看如何将其转换为 DataFrame 对象。

                             value
id Date       previous_date       
5  2020-03-15 2020-01-15        16
7  2019-06-25 2019-05-19         8

您可以找到更多关于dataframesgroupbymerge 等的信息。

【讨论】:

  • 谢谢!这就像一个魅力。我完全错过了这种解决方案,并且想得更复杂。我只是在最终命令的末尾添加了 reset_index()。
【解决方案2】:

问题原本有一个sql标签。

如果我理解逻辑,您需要 join 和聚合:

select s.date, s.date, s.previous_date, sum(db.value)
from starting s left join
     db
     on db.id = s.id and
        db.date between s.previous_date and s.date
group by s.date, s.date, s.previous_date;

【讨论】:

  • 感谢您的回答戈登。在这里,我必须处理熊猫数据框和存储的数据库表(我可以将其作为数据框传递)。据我所知,您在 sql 基础上编写了逻辑,假设左表存储在数据库中,这是错误的,因为左表(起始)不是 db 表,而是 pandas 数据框。我也忘了提到左表(熊猫数据框)中的 ID 不是唯一的。谢谢
  • @AntonisAgg 。 . .您的问题被标记为 SQL。这是一个 SQL 答案。
  • 你说得对,我修好了。感谢您对我的问题 Gordon 感兴趣。
猜你喜欢
  • 2021-04-22
  • 2020-09-15
  • 1970-01-01
  • 1970-01-01
  • 2015-05-01
  • 2010-10-04
  • 2019-11-08
  • 2023-01-03
  • 1970-01-01
相关资源
最近更新 更多