python - pandas 相当于复杂的 SQL 查询(由子查询组成)

标签 python pandas subquery

谁能告诉我以下 SQL 查询的 pandas 等效项。 将 sales_data 视为表名/pd.DataFrame

SELECT store_id, store_name, sales FROM sales_data WHERE sales = (SELECT max(sales) FROM sales_data WHERE store_location = 'Beijing') and store_location = 'Beijing'

我知道,我们可以通过两步实现这一目标:

1) df = sales_data[sales_data['store_location'] == 'Beijing'][['store_id', 'store_name', 'sales']]
2) df[df['sales'] == df['sales'].max()]

但是我们可以一步实现吗?有办法吗?

最佳答案

在这种情况下,我不会尝试一步完成,因为它可能会更慢:

演示:

数据:

In [103]: df
Out[103]:
   a  b  c  x
0  2  1  1  b
1  2  3  2  a
2  4  1  3  c
3  3  2  3  b
4  2  1  4  c
5  1  3  1  c
6  2  3  0  a
7  2  3  2  b
8  4  2  4  a
9  4  1  1  b

一步解决方案:

In [104]: df.ix[(df.x == 'a') & (df.b == df.ix[df.x == 'a', 'b'].max())]
Out[104]:
   a  b  c  x
1  2  3  2  a
6  2  3  0  a

与 1M 行 DF 的时序比较:

In [105]: big = pd.concat([df] * 10**5, ignore_index=True)

In [106]: big.shape
Out[106]: (1000000, 4)

In [111]: %%timeit
   .....: x = big.ix[big.x == 'a']
   .....: x.ix[x.b == x.b.max()]
   .....:
10 loops, best of 3: 189 ms per loop

In [112]: %timeit big.ix[(big.x == 'a') & (big.b == big.ix[big.x == 'a', 'b'].max())]
1 loop, best of 3: 321 ms per loop

结论:您的两步方法几乎快了 2 倍

不正确答案:

In [115]: df.ix[df.x == 'a'].nlargest(1, columns=['b'])
Out[115]:
   a  b  c  x
1  2  3  2  a

注意:这个答案是不正确的,因为它总是只返回一行,即使有多行满足此条件:column = max(column)

说明:

In [114]: df.ix[df.x == 'a']
Out[114]:
   a  b  c  x
1  2  3  2  a
6  2  3  0  a
8  4  2  4  a

正确答案:

In [116]: df.ix[(df.x == 'a') & (df.b == df.ix[df.x == 'a', 'b'].max())]
Out[116]:
   a  b  c  x
1  2  3  2  a
6  2  3  0  a

关于python - pandas 相当于复杂的 SQL 查询(由子查询组成),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39307435/

相关文章:

mysql - 我如何子查询两个连接?

mysql - SQL 平衡计算按日期排序

python - 如何使用Beautifulsoup4和Python 3 Web抓取youtube成绩单

python - 将 Pandas 数据集转换为数组,以便在 Scikit-Learn 中建模

mysql - 如何在需要来自 super 查询的数据的 where 子句中使用带有 where 子句的 mysql 子查询

python - 使用 pandas 重复数据框中的项目

python - 为什么 pandas Dataframe.to_csv 的输出与 Series.to_csv 不同?

python - 使用 dpkt 的微秒分辨率

python - Maya python迭代大量顶点

android - Android 上的 PyAudio