用dataframe重写sql查询;如何从选择中混合不同的来源

Posted

技术标签:

【中文标题】用dataframe重写sql查询;如何从选择中混合不同的来源【英文标题】:Rewriting the sql query with dataframe; how to mix different sources from select 【发布时间】:2021-05-13 15:09:20 【问题描述】:

我需要使用 pandas 和数据框重写 sql 查询,并通过几个连接到 python。进行联接没有问题,但是当我想引用并非严格来自联接的数据时,它会变得复杂。

要重写的SQL:

SELECT 
    table1.id,
    field1,
    field2,
    count(DISTINCT x.apple, x.grape) AS fruits,
    min(x.time) min_value
FROM table1
    JOIN table2 x using(id)
    LEFT JOIN table3 using(id)
GROUP BY 1,2,3

我当前的代码:

mydf, df2, df3 = ...
mydf.merge(df2, on=['id'], how='inner')
mydf.merge(df3, on['id'], how='left')
mydf = mydf[['id', 'field1', 'field2']] # problem, missing fruits, min_value and id should be table1.id
mydf.groupby('id', 'field1', 'field2')

我知道如何加入它们,但我不知道如何创建一个数据框,该数据框将包含来自选择的所需元素,例如table1.idmin(x.time) min_value

表格

Table1 columns: [id, field1, field2, field1_2, field1_3]
Table2 columns: [id, field1, field2, apple, grape, time, field2_1, field2_2]
Table3 columns: [id, field1, field2, field3_1, field3_2]

编辑:我添加了示例表,更正了代码第 4 行中的错误,并添加了摘要。

【问题讨论】:

您有可以用来测试我们的解决方案的示例数据吗? 在创建数据框时,您需要确保仅选择相关列。这样加入和结果将与预期相同。同样在您的示例中,您还没有在 Python 中完成分组。 如果您想确保可以在这里得到答案,最好提供一些示例数据(例如,合并后数据框的前几行)。 【参考方案1】:

试试这个:

    mydf = mydf[['id', 'table1', 'table2']]

【讨论】:

对不起,我犯了一个错误,我提供了错误的代码。而不是mydf = mydf[mydf['id', 'field1', 'field2']] 我的意思是mydf = mydf[['id', 'field1', 'field2']]。我已经纠正了帖子中的错误。

以上是关于用dataframe重写sql查询;如何从选择中混合不同的来源的主要内容,如果未能解决你的问题,请参考以下文章

如何重写具有连接子查询的 SQL 查询

如何从 Snowflake SQL 查询创建 PySpark pandas-on-Spark DataFrame?

如何将 BigQuery SQL 查询结果转换为 Spark DataFrame?

如何将关联连接从 SQL 重写为 LINQ

如何将 sql 查询转换为 Pandas Dataframe 和 PySpark Dataframe

如何在 java/xuggler 中混音多个音频通道?