谁能告诉我以下 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/