相当于 pandas DataFrame 查询的 SQL

Posted

技术标签:

【中文标题】相当于 pandas DataFrame 查询的 SQL【英文标题】:SQL equivalent of pandas DataFrame query 【发布时间】:2018-03-26 14:45:41 【问题描述】:

我正在尝试实现一个等效于 pandas 查询的 SQL 查询:

df.groupby([df.ST_STATE, 'INVOICE'])['VALUE'].sum()

这将返回所有发票及其在状态组中的值,如下所示:

WV        114763      28.00
          116443      16.50
          116490      24.00
          116550      46.00
WY        100099       9.00
          100148       9.00
          100881      32.00
          101119      28.00

我编写了一个 SQL 查询来从 Google Cloud 获取相同类型的结果集:

query = "SELECT State, Invoice, sum(Value) FROM ["+self.table+"] group by Invoice, State"

但它返回一个标准的结果集:

    State   Invoice f0_
0   NY  100008  86.00
1   None    100335  64.00
2   NY  100685  60.00

我需要如何操作 SQL 查询以获得与我的 DataFrame 示例相同形状的结果?

【问题讨论】:

您是指状态值重复的多索引感觉,而是重复值为空白的数据透视表方式? 是的,我想首先制作一个多索引数据框 基于您提供的相关示例数据 - 请显示预期结果 【参考方案1】:

看起来您需要做的就是通过以下方式更改组的顺序:

query = "SELECT State, Invoice, sum(Value) FROM ["+self.table+"] group by State, Invoice"

因此,分组的应用顺序与您的 pandas 示例中的顺序相同。

【讨论】:

状态仍然重复 问题中没有提到这是您想要的输出。【参考方案2】:

以下是纯 SQL(BigQuery 标准 SQL)中的示例 - 希望您可以将其“翻译”成相应的 pandas

#standardSQL
WITH t AS (
  SELECT 'WV' state, [STRUCT<invoice INT64, value FLOAT64>
    (114763, 28.00),
    (114763, 16.50),
    (116490, 24.00),
    (116490, 46.00)
  ] info UNION ALL
  SELECT 'WY', [STRUCT<invoice INT64, value FLOAT64>
    (100099, 9.00),
    (100148, 9.00),
    (100099, 32.00),
    (100148, 28.00)
  ]
)
SELECT state, 
  ARRAY(
    SELECT AS STRUCT invoice, SUM(value) AS value 
    FROM UNNEST(info) i GROUP BY invoice
  ) info
FROM t   

结果与原始数据形状相同,如下所示

Row state   info.invoice    info.value   
1   WV      114763          44.5     
            116490          70.0     
2   WY      100099          41.0     
            100148          37.0     

注意:我稍微修改了您的数据示例,以便进行分组

【讨论】:

以上是关于相当于 pandas DataFrame 查询的 SQL的主要内容,如果未能解决你的问题,请参考以下文章

pandas中DataFrame的查询方法

pandas表连接

9.Pandas怎样实现DataFrame的Merge

如何在 Pandas DataFrame 上计算滚动累积乘积

Pandas - DataFrame 基本操作

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