相当于 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的主要内容,如果未能解决你的问题,请参考以下文章