pandas与sql对应关系【帮助sql使用者快速上手pandas】
本页旨在提供一些如何使用pandas执行各种SQL操作的示例,来帮助SQL使用者快速上手使用pandas。
目录
- SQL语法
- 一、选择SELECT
- 1、选择
- 2、添加计算列
- 二、连接JOIN ON
- 1、内连接
- 2、左外连接
- 3、右外连接
- 4、全外连接
- 三、过滤WHERE
- 1、AND
- 2、OR
- 3、IS NULL
- 4、IS NOT NULL
- 5、BETWEEN
- 6、LIKE
- 7、CASE WHEN
- 四、分组GROUP BY
- 1、count()
- 2、avg()
- 3、sum()、max()、min()
- 五、HAVING
- 六、排序ORDER BY
- 七、LIMIT/OFFSET
- 1、LIMIT
- 2、指定列中最大的前N行
- 3、OFFSET
- 八、UNION ALL/UNION
- 1、UNION ALL
- 2、UNION
- 九、开窗函数
- 1、ROW_NUMBER()
- 2、RANK()
- 3、SUM()
SQL语法
- SELECT [DISTINCT | ALL] column1, column2, …, aggregate_function(columnN), …
- FROM
- table_name [AS alias]
- [JOIN type JOIN table2_name [AS alias2] ON join_condition]
- [, JOIN type JOIN table3_name [AS alias3] ON join_condition, …]
- [WHERE condition]
- [GROUP BY column1, column2, …]
- [HAVING condition]
- [ORDER BY column1 [ASC | DESC], column2 [ASC | DESC], …]
- [LIMIT number [OFFSET offset]]
- [UNION [ALL] SELECT …] – 可以链式添加多个UNION SELECT语句
- DISTINCT:确保结果集中的行是唯一的。ALL(默认)表示返回所有匹配的行,包括重复的行。
- aggregate_function():聚合函数,如**SUM(), AVG(), COUNT(), MAX(), MIN()**等,用于对一组值执行计算并返回单个值。
- JOIN type:指定连接类型,如INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL JOIN等。ON join_condition:定义连接条件。
- WHERE condition:过滤结果集中的行,只返回满足条件的行。
- GROUP BY:将结果集按一个或多个列分组。通常与聚合函数一起使用。
- HAVING condition:过滤分组后的结果集,只返回满足条件的组。
- ORDER BY:对结果集进行排序。可以指定多个列和排序方向(ASC升序[默认]或DESC降序)。
- LIMIT number [OFFSET offset]:限制返回的行数,并可选地指定跳过的行数。
- UNION [ALL]:合并两个或多个SELECT语句的结果集。UNION默认去除重复行,而UNION ALL保留所有行。
一、选择SELECT
在SQL中,选择是使用要选择的列的逗号分隔列表(或* 选择所有列)
1、选择
SQL语法:
SELECT total_bill, tip, smoker, time
FROM data;
对应pandas实现:
In :data[["total_bill", "tip", "smoker", "time"]]
Out :
total_bill tip smoker time
0 16.99 1.01 No Dinner
1 10.34 1.66 No Dinner
2 21.01 3.50 No Dinner
3 23.68 3.31 No Dinner
4 24.59 3.61 No Dinner
... ... ... ... ...
239 29.03 5.92 No Dinner
240 27.18 2.00 Yes Dinner
241 22.67 2.00 Yes Dinner
242 17.82 1.75 No Dinner
243 18.78 3.00 No Dinner
2、添加计算列
SQL语法:
SELECT *, tip/total_bill as tip_rate
FROM data;
对应pandas实现:
1)可以使用DataFrame的DataFrame.assign()方法来追加新列
In :data = data.assign(tip_rate=data["tip"] / data["total_bill"])
In :dataOut :
total_bill tip sex smoker day time size tip_rate
0 16.99 1.01 Female No Sun Dinner 2 0.059447
1 10.34 1.66 Male No Sun Dinner 3 0.160542
2 21.01 3.50 Male No Sun Dinner 3 0.166587
3 23.68 3.31 Male No Sun Dinner 2 0.139780
4 24.59 3.61 Female No Sun Dinner 4 0.146808
... ... ... ... ... ... ... ... ...
239 29.03 5.92 Male No Sat Dinner 3 0.203927
240 27.18 2.00 Female Yes Sat Dinner 2 0.073584
241 22.67 2.00 Male Yes Sat Dinner 2 0.088222
242 17.82 1.75 Male No Sat Dinner 2 0.098204
243 18.78 3.00 Female No Thur Dinner 2 0.159744
2)也可以直接计算
In :data['tip_rate2'] = data["tip"] / data["total_bill"]
In :dataOut :
total_bill tip sex smoker day time size tip_rate tip_rate2
0 16.99 1.01 Female No Sun Dinner 2 0.059447 0.059447
1 10.34 1.66 Male No Sun Dinner 3 0.160542 0.160542
2 21.01 3.50 Male No Sun Dinner 3 0.166587 0.166587
3 23.68 3.31 Male No Sun Dinner 2 0.139780 0.139780
4 24.59 3.61 Female No Sun Dinner 4 0.146808 0.146808
... ... ... ... ... ... ... ... ... ...
239 29.03 5.92 Male No Sat Dinner 3 0.203927 0.203927
240 27.18 2.00 Female Yes Sat Dinner 2 0.073584 0.073584
241 22.67 2.00 Male Yes Sat Dinner 2 0.088222 0.088222
242 17.82 1.75 Male No Sat Dinner 2 0.098204 0.098204
243 18.78 3.00 Female No Thur Dinner 2 0.159744 0.159744
二、连接JOIN ON
构造测试数据
In :df1 = pd.DataFrame({"key": ["A", "B", "C", "D"], "value": np.random.randn(4)})
In :df2 = pd.DataFrame({"key": ["B", "D", "D", "E"], "value": np.random.randn(4)})
1、内连接
SQL语法:
SELECT *
FROM df1
INNER JOIN df2ON df1.key = df2.key;
对应pandas实现:
In :pd.merge(df1, df2, on="key")
Out :
key value_x value_y
0 B 0.227232 1.011278
1 D 1.415853 -0.149207
2 D 1.415853 -0.608430
2、左外连接
SQL语法:
SELECT *
FROM df1
LEFT OUTER JOIN df2ON df1.key = df2.key;
对应pandas实现:
In :pd.merge(df1, df2, on="key", how="left")
Out :
key value_x value_y
0 A 1.418532 NaN
1 B 0.227232 1.011278
2 C -0.578408 NaN
3 D 1.415853 -0.149207
4 D 1.415853 -0.608430
3、右外连接
SQL语法:
SELECT *
FROM df1
RIGHT OUTER JOIN df2ON df1.key = df2.key;
对应pandas实现:
In :pd.merge(df1, df2, on="key", how="right")
Out :
key value_x value_y
0 B 0.227232 1.011278
1 D 1.415853 -0.149207
2 D 1.415853 -0.608430
3 E NaN 1.437388
4、全外连接
SQL语法:
SELECT *
FROM df1
FULL OUTER JOIN df2ON df1.key = df2.key;
对应pandas实现:
In :pd.merge(df1, df2, on="key", how="outer")
Out :key value_x value_y
0 A 1.418532 NaN
1 B 0.227232 1.011278
2 C -0.578408 NaN
3 D 1.415853 -0.149207
4 D 1.415853 -0.608430
5 E NaN 1.437388
三、过滤WHERE
SQL中的过滤是通过WHERE子句完成的。
SQL语法:
SELECT *
FROM data
WHERE total_bill >10;
对应pandas实现:
In :data[data["total_bill"] > 10]
Out :
total_bill tip sex smoker day time size tip_rate tip_rate2
0 16.99 1.01 Female No Sun Dinner 2 0.059447 0.059447
1 10.34 1.66 Male No Sun Dinner 3 0.160542 0.160542
2 21.01 3.50 Male No Sun Dinner 3 0.166587 0.166587
3 23.68 3.31 Male No Sun Dinner 2 0.139780 0.139780
4 24.59 3.61 Female No Sun Dinner 4 0.146808 0.146808
... ... ... ... ... ... ... ... ... ...
239 29.03 5.92 Male No Sat Dinner 3 0.203927 0.203927
240 27.18 2.00 Female Yes Sat Dinner 2 0.073584 0.073584
241 22.67 2.00 Male Yes Sat Dinner 2 0.088222 0.088222
242 17.82 1.75 Male No Sat Dinner 2 0.098204 0.098204
243 18.78 3.00 Female No Thur Dinner 2 0.159744 0.159744
1、AND
对应pandas中的&
SQL语法:
# 查询晚餐小费超过5美元的数据
SELECT *
FROM data
WHERE time = 'Dinner' AND tip > 5.00;
对应pandas实现:
In :data[(data["time"] == "Dinner") & (data["tip"] > 5.00)]
Out :
total_bill tip sex smoker day time size tip_rate tip_rate2
23 39.42 7.58 Male No Sat Dinner 4 0.192288 0.192288
44 30.40 5.60 Male No Sun Dinner 4 0.184211 0.184211
47 32.40 6.00 Male No Sun Dinner 4 0.185185 0.185185
52 34.81 5.20 Female No Sun Dinner 4 0.149382 0.149382
59 48.27 6.73 Male No Sat Dinner 4 0.139424 0.139424
116 29.93 5.07 Male No Sun Dinner 4 0.169395 0.169395
155 29.85 5.14 Female No Sun Dinner 5 0.172194 0.172194
170 50.81 10.00 Male Yes Sat Dinner 3 0.196812 0.196812
172 7.25 5.15 Male Yes Sun Dinner 2 0.710345 0.710345
181 23.33 5.65 Male Yes Sun Dinner 2 0.242177 0.242177
183 23.17 6.50 Male Yes Sun Dinner 4 0.280535 0.280535
211 25.89 5.16 Male Yes Sat Dinner 4 0.199305 0.199305
212 48.33 9.00 Male No Sat Dinner 4 0.186220 0.186220
214 28.17 6.50 Female Yes Sat Dinner 3 0.230742 0.230742
239 29.03 5.92 Male No Sat Dinner 3 0.203927 0.203927
2、OR
对应pandas中的|
SQL语法:
# 查询至少5名用餐者的小费或账单总额超过45美元的数据
SELECT *
FROM data
WHERE size >= 5 OR total_bill > 45;
对应pandas实现:
In :data[(data["size"] >= 5) | (data["total_bill"] > 45)]
Out :
total_bill tip sex smoker day time size tip_rate tip_rate2
59 48.27 6.73 Male No Sat Dinner 4 0.139424 0.139424
125 29.80 4.20 Female No Thur Lunch 6 0.140940 0.140940
141 34.30 6.70 Male No Thur Lunch 6 0.195335 0.195335
142 41.19 5.00 Male No Thur Lunch 5 0.121389 0.121389
143 27.05 5.00 Female No Thur Lunch 6 0.184843 0.184843
155 29.85 5.14 Female No Sun Dinner 5 0.172194 0.172194
156 48.17 5.00 Male No Sun Dinner 6 0.103799 0.103799
170 50.81 10.00 Male Yes Sat Dinner 3 0.196812 0.196812
182 45.35 3.50 Male Yes Sun Dinner 3 0.077178 0.077178
185 20.69 5.00 Male No Sun Dinner 5 0.241663 0.241663
187 30.46 2.00 Male Yes Sun Dinner 5 0.065660 0.065660
212 48.33 9.00 Male No Sat Dinner 4 0.186220 0.186220
216 28.15 3.00 Male Yes Sat Dinner 5 0.106572 0.106572
3、IS NULL
构造测试数据
In :frame = pd.DataFrame({"col1": ["A", "B", np.nan, "C", "D"], "col2": ["F", np.nan, "G", "H", "I"]}
)
SQL语法:
SELECT *
FROM frame
WHERE col2 IS NULL;
对应pandas实现:
In :frame[frame["col2"].isna()]
Out :
col1 col2
1 B NaN
4、IS NOT NULL
SQL语法:
SELECT *
FROM frame
WHERE col1 IS NOT NULL;
对应pandas实现:
In :frame[frame["col1"].notna()]
Out :
col1 col2
0 A F
1 B NaN
3 C H
4 D I
5、BETWEEN
SQL语法:
SELECT *
FROM data
WHERE tip between 5 and 7;
对应pandas实现:
In :data[data['tip'].between(5, 7)]
Out :total_bill tip sex smoker day time size tip_rate tip_rate2
11 35.26 5.00 Female No Sun Dinner 4 0.141804 0.141804
39 31.27 5.00 Male No Sat Dinner 3 0.159898 0.159898
44 30.40 5.60 Male No Sun Dinner 4 0.184211 0.184211
46 22.23 5.00 Male No Sun Dinner 2 0.224921 0.224921
47 32.40 6.00 Male No Sun Dinner 4 0.185185 0.185185
52 34.81 5.20 Female No Sun Dinner 4 0.149382 0.149382
59 48.27 6.73 Male No Sat Dinner 4 0.139424 0.139424
73 25.28 5.00 Female Yes Sat Dinner 2 0.197785 0.197785
83 32.68 5.00 Male Yes Thur Lunch 2 0.152999 0.152999
85 34.83 5.17 Female No Thur Lunch 4 0.148435 0.148435
88 24.71 5.85 Male No Thur Lunch 2 0.236746 0.236746
116 29.93 5.07 Male No Sun Dinner 4 0.169395 0.169395
141 34.30 6.70 Male No Thur Lunch 6 0.195335 0.195335
142 41.19 5.00 Male No Thur Lunch 5 0.121389 0.121389
143 27.05 5.00 Female No Thur Lunch 6 0.184843 0.184843
155 29.85 5.14 Female No Sun Dinner 5 0.172194 0.172194
156 48.17 5.00 Male No Sun Dinner 6 0.103799 0.103799
172 7.25 5.15 Male Yes Sun Dinner 2 0.710345 0.710345
181 23.33 5.65 Male Yes Sun Dinner 2 0.242177 0.242177
183 23.17 6.50 Male Yes Sun Dinner 4 0.280535 0.280535
185 20.69 5.00 Male No Sun Dinner 5 0.241663 0.241663
197 43.11 5.00 Female Yes Thur Lunch 4 0.115982 0.115982
211 25.89 5.16 Male Yes Sat Dinner 4 0.199305 0.199305
214 28.17 6.50 Female Yes Sat Dinner 3 0.230742 0.230742
239 29.03 5.92 Male No Sat Dinner 3 0.203927 0.203927
6、LIKE
开头/结尾字符匹配可以用startswith()/endswith()函数实现
SQL语法:
SELECT *
FROM data
WHERE time like 'Di%';
对应pandas实现:
In :data[data['time'].str.startswith('Di')]
Out :
total_bill tip sex smoker day time size tip_rate tip_rate2
0 16.99 1.01 Female No Sun Dinner 2 0.059447 0.059447
1 10.34 1.66 Male No Sun Dinner 3 0.160542 0.160542
2 21.01 3.50 Male No Sun Dinner 3 0.166587 0.166587
3 23.68 3.31 Male No Sun Dinner 2 0.139780 0.139780
4 24.59 3.61 Female No Sun Dinner 4 0.146808 0.146808
... ... ... ... ... ... ... ... ... ...
239 29.03 5.92 Male No Sat Dinner 3 0.203927 0.203927
240 27.18 2.00 Female Yes Sat Dinner 2 0.073584 0.073584
241 22.67 2.00 Male Yes Sat Dinner 2 0.088222 0.088222
242 17.82 1.75 Male No Sat Dinner 2 0.098204 0.098204
243 18.78 3.00 Female No Thur Dinner 2 0.159744 0.159744
中间字符匹配可以用contains()函数实现,na参数设置为False表示在缺失值上不返回True,case参数设置为False表示不区分大小写匹配
SQL语法:
SELECT *
FROM data
WHERE time like '%inne%';
对应pandas实现:
In :data[data['time'].str.contains('inne', na=False, case=False)]
Out :
total_bill tip sex smoker day time size tip_rate tip_rate2
0 16.99 1.01 Female No Sun Dinner 2 0.059447 0.059447
1 10.34 1.66 Male No Sun Dinner 3 0.160542 0.160542
2 21.01 3.50 Male No Sun Dinner 3 0.166587 0.166587
3 23.68 3.31 Male No Sun Dinner 2 0.139780 0.139780
4 24.59 3.61 Female No Sun Dinner 4 0.146808 0.146808
... ... ... ... ... ... ... ... ... ...
239 29.03 5.92 Male No Sat Dinner 3 0.203927 0.203927
240 27.18 2.00 Female Yes Sat Dinner 2 0.073584 0.073584
241 22.67 2.00 Male Yes Sat Dinner 2 0.088222 0.088222
242 17.82 1.75 Male No Sat Dinner 2 0.098204 0.098204
243 18.78 3.00 Female No Thur Dinner 2 0.159744 0.159744
7、CASE WHEN
SQL语法:
SELECT tip,case when tip<2 then 'LOW'when 2<=tip<=3 then 'MID'when 3<tip then 'HIG'end flag
FROM data;
对应pandas实现:
In :data['flag'] = data['tip'].apply(lambda x: 'LOW' if x < 2 else ('MID' if 2 <= x <= 3 else 'HIG'))
In :data[['tip', 'flag']]
Out :tip flag
0 1.01 LOW
1 1.66 LOW
2 3.50 HIG
3 3.31 HIG
4 3.61 HIG
... ... ...
239 5.92 HIG
240 2.00 MID
241 2.00 MID
242 1.75 LOW
243 3.00 MID
四、分组GROUP BY
在pandas中,SQL的GROUP BY操作是使用类似名称的 groupby()方法。配合aggregate_function()使用
1、count()
SQL语法:
SELECT sex, count(*)
FROM data
GROUP BY sex;
对应pandas实现:
In :data.groupby("sex").size()
Out :
sex
Female 87
Male 157
dtype: int64
2、avg()
SQL语法:
SELECT day, AVG(tip), COUNT(*)
FROM tips
GROUP BY day;
对应pandas实现:
In :data.groupby("day").agg({"tip": "mean", "day": "size"})
Out :
tip day
day
Fri 2.734737 19
Sat 2.993103 87
Sun 3.255132 76
Thur 2.771452 62
3、sum()、max()、min()
SQL语法:
SELECT day, AVG(tip), SUM(tip), MAX(tip), MIN(tip), COUNT(tip)
FROM data
GROUP BY day;
对应pandas实现:
In :data.groupby("day").agg({"tip": ["mean", "sum", "max", "min"],"day": "size"
}).reset_index()
Out :
day tip day
mean sum max min size
0 Fri 2.734737 51.96 4.73 1.00 19
1 Sat 2.993103 260.40 10.00 1.00 87
2 Sun 3.255132 247.39 6.50 1.01 76
3 Thur 2.771452 171.83 6.70 1.25 62
五、HAVING
SQL语法:
SELECT day, AVG(tip), SUM(tip), MAX(tip), MIN(tip), COUNT(*)
FROM data
GROUP BY day
HAVING SUM(tip) > 200;
对应pandas实现:
In :result = data.groupby("day").agg({"tip": ["mean", "sum", "max", "min"],"day": "size"
}).reset_index()
In :result.columns = ['day', 'avg_tip', 'sum_tip', 'max_tip', 'min_tip', 'count_tips']
In :result[result['sum_tip'] > 200].reset_index()
Out :index day avg_tip sum_tip max_tip min_tip count_tips
0 1 Sat 2.993103 260.40 10.0 1.00 87
1 2 Sun 3.255132 247.39 6.5 1.01 76
六、排序ORDER BY
SQL语法:
SELECT *
FROM data
ORDER BY tip;
对应pandas实现:
In :data.sort_values("tip")
Out :
total_bill tip sex smoker day time size tip_rate tip_rate2
67 3.07 1.00 Female Yes Sat Dinner 1 0.325733 0.325733
236 12.60 1.00 Male Yes Sat Dinner 2 0.079365 0.079365
92 5.75 1.00 Female Yes Fri Dinner 2 0.173913 0.173913
111 7.25 1.00 Female No Sat Dinner 1 0.137931 0.137931
0 16.99 1.01 Female No Sun Dinner 2 0.059447 0.059447
... ... ... ... ... ... ... ... ... ...
141 34.30 6.70 Male No Thur Lunch 6 0.195335 0.195335
59 48.27 6.73 Male No Sat Dinner 4 0.139424 0.139424
23 39.42 7.58 Male No Sat Dinner 4 0.192288 0.192288
212 48.33 9.00 Male No Sat Dinner 4 0.186220 0.186220
170 50.81 10.00 Male Yes Sat Dinner 3 0.196812 0.196812
SQL语法:
SELECT *
FROM data
ORDER BY tip,total_bill;
对应pandas实现:
In :data.sort_values(["tip","total_bill"])
Out :
total_bill tip sex smoker day time size tip_rate tip_rate2
67 3.07 1.00 Female Yes Sat Dinner 1 0.325733 0.325733
92 5.75 1.00 Female Yes Fri Dinner 2 0.173913 0.173913
111 7.25 1.00 Female No Sat Dinner 1 0.137931 0.137931
236 12.60 1.00 Male Yes Sat Dinner 2 0.079365 0.079365
0 16.99 1.01 Female No Sun Dinner 2 0.059447 0.059447
... ... ... ... ... ... ... ... ... ...
141 34.30 6.70 Male No Thur Lunch 6 0.195335 0.195335
59 48.27 6.73 Male No Sat Dinner 4 0.139424 0.139424
23 39.42 7.58 Male No Sat Dinner 4 0.192288 0.192288
212 48.33 9.00 Male No Sat Dinner 4 0.186220 0.186220
170 50.81 10.00 Male Yes Sat Dinner 3 0.196812 0.196812
SQL语法:
SELECT *
FROM data
ORDER BY tip asc,total_bill desc;
对应pandas实现:
In :data.sort_values(by=["tip", "total_bill"], ascending=[True, False])
Out :total_bill tip sex smoker day time size tip_rate tip_rate2
236 12.60 1.00 Male Yes Sat Dinner 2 0.079365 0.079365
111 7.25 1.00 Female No Sat Dinner 1 0.137931 0.137931
92 5.75 1.00 Female Yes Fri Dinner 2 0.173913 0.173913
67 3.07 1.00 Female Yes Sat Dinner 1 0.325733 0.325733
0 16.99 1.01 Female No Sun Dinner 2 0.059447 0.059447
... ... ... ... ... ... ... ... ... ...
141 34.30 6.70 Male No Thur Lunch 6 0.195335 0.195335
59 48.27 6.73 Male No Sat Dinner 4 0.139424 0.139424
23 39.42 7.58 Male No Sat Dinner 4 0.192288 0.192288
212 48.33 9.00 Male No Sat Dinner 4 0.186220 0.186220
170 50.81 10.00 Male Yes Sat Dinner 3 0.196812 0.196812
七、LIMIT/OFFSET
1、LIMIT
在pandas中使用head()实现
SQL语法:
SELECT *
FROM data
LIMIT 10;
对应pandas实现:
In :data.head(10)
Out :
total_bill tip sex smoker day time size tip_rate tip_rate2
0 16.99 1.01 Female No Sun Dinner 2 0.059447 0.059447
1 10.34 1.66 Male No Sun Dinner 3 0.160542 0.160542
2 21.01 3.50 Male No Sun Dinner 3 0.166587 0.166587
3 23.68 3.31 Male No Sun Dinner 2 0.139780 0.139780
4 24.59 3.61 Female No Sun Dinner 4 0.146808 0.146808
5 25.29 4.71 Male No Sun Dinner 4 0.186240 0.186240
6 8.77 2.00 Male No Sun Dinner 2 0.228050 0.228050
7 26.88 3.12 Male No Sun Dinner 4 0.116071 0.116071
8 15.04 1.96 Male No Sun Dinner 2 0.130319 0.130319
9 14.78 3.23 Male No Sun Dinner 2 0.218539 0.218539
2、指定列中最大的前N行
SQL语法:
SELECT *
FROM data
ORDER BY tip DESC
LIMIT 10;
对应pandas实现:
In :data.nlargest(10, columns="tip")
或
In :data.sort_values(by="tip", ascending=False).head(10)
Out :
total_bill tip sex smoker day time size tip_rate tip_rate2
170 50.81 10.00 Male Yes Sat Dinner 3 0.196812 0.196812
212 48.33 9.00 Male No Sat Dinner 4 0.186220 0.186220
23 39.42 7.58 Male No Sat Dinner 4 0.192288 0.192288
59 48.27 6.73 Male No Sat Dinner 4 0.139424 0.139424
141 34.30 6.70 Male No Thur Lunch 6 0.195335 0.195335
183 23.17 6.50 Male Yes Sun Dinner 4 0.280535 0.280535
214 28.17 6.50 Female Yes Sat Dinner 3 0.230742 0.230742
47 32.40 6.00 Male No Sun Dinner 4 0.185185 0.185185
239 29.03 5.92 Male No Sat Dinner 3 0.203927 0.203927
88 24.71 5.85 Male No Thur Lunch 2 0.236746 0.236746
3、OFFSET
跳过排序后的前5行,选出接下来的10行
SQL语法:
SELECT * FROM tips
ORDER BY tip DESC
LIMIT 10 OFFSET 5;
对应pandas实现:
In :data.sort_values(by="tip", ascending=False).iloc[5:15]
Out :
total_bill tip sex smoker day time size tip_rate tip_rate2
214 28.17 6.50 Female Yes Sat Dinner 3 0.230742 0.230742
183 23.17 6.50 Male Yes Sun Dinner 4 0.280535 0.280535
47 32.40 6.00 Male No Sun Dinner 4 0.185185 0.185185
239 29.03 5.92 Male No Sat Dinner 3 0.203927 0.203927
88 24.71 5.85 Male No Thur Lunch 2 0.236746 0.236746
181 23.33 5.65 Male Yes Sun Dinner 2 0.242177 0.242177
44 30.40 5.60 Male No Sun Dinner 4 0.184211 0.184211
52 34.81 5.20 Female No Sun Dinner 4 0.149382 0.149382
85 34.83 5.17 Female No Thur Lunch 4 0.148435 0.148435
211 25.89 5.16 Male Yes Sat Dinner 4 0.199305 0.199305
八、UNION ALL/UNION
pandas中使用concat()函数实现
构造测试数据
In :df1 = pd.DataFrame({"city": ["Chicago", "San Francisco", "New York City"], "rank": range(1, 4)}
)
In :df2 = pd.DataFrame({"city": ["Chicago", "Boston", "Los Angeles"], "rank": [1, 4, 5]}
)
1、UNION ALL
SQL语法:
SELECT city, rank
FROM df1
UNION ALL
SELECT city, rank
FROM df2;
对应pandas实现:
In :pd.concat([df1, df2])
Out :
city rank
0 Chicago 1
1 San Francisco 2
2 New York City 3
0 Chicago 1
1 Boston 4
2 Los Angeles 5
2、UNION
SQL语法:
SELECT city, rank
FROM df1
UNION
SELECT city, rank
FROM df2;
对应pandas实现:
In :pd.concat([df1, df2]).drop_duplicates()
Out :city rank
0 Chicago 1
1 San Francisco 2
2 New York City 3
1 Boston 4
2 Los Angeles 5
九、开窗函数
1、ROW_NUMBER()
为结果集中的每一行分配一个唯一的数字,顺序为1,2,3,4,5……
SQL语法:
查询每天total_bill最大的两行数据
SELECT * FROM (SELECTt.*,ROW_NUMBER() OVER(PARTITION BY day ORDER BY total_bill DESC) AS rnFROM data t
)
WHERE rn < 3
ORDER BY day, rn;
对应pandas实现:
In :(data.assign(rn=data.sort_values(["total_bill"], ascending=False).groupby(["day"]).cumcount()+ 1).query("rn < 3").sort_values(["day", "rn"])
)
Out :
total_bill tip sex smoker day time size tip_rate tip_rate2 rn
95 40.17 4.73 Male Yes Fri Dinner 4 0.117750 0.117750 1
90 28.97 3.00 Male Yes Fri Dinner 2 0.103555 0.103555 2
170 50.81 10.00 Male Yes Sat Dinner 3 0.196812 0.196812 1
212 48.33 9.00 Male No Sat Dinner 4 0.186220 0.186220 2
156 48.17 5.00 Male No Sun Dinner 6 0.103799 0.103799 1
182 45.35 3.50 Male Yes Sun Dinner 3 0.077178 0.077178 2
197 43.11 5.00 Female Yes Thur Lunch 4 0.115982 0.115982 1
142 41.19 5.00 Male No Thur Lunch 5 0.121389 0.121389 2
2、RANK()
为结果集中的每一行分配一个排名,相同的值会获得相同的排名,但会跳过之后的排名,顺序为1,2,2,4,5,5,5,8……
SQL语法:
查询每天total_bill最大的两行数据
SELECT * FROM (SELECTt.*,RANK() OVER(PARTITION BY day ORDER BY total_bill DESC) AS rnFROM data t
)
WHERE rn < 3
ORDER BY day, rn;
对应pandas实现:
In :(data.assign(rnk=data.groupby(["day"])["total_bill"].rank(method="first", ascending=False)).query("rnk < 3").sort_values(["day", "rnk"])
)
Out :
total_bill tip sex smoker day time size tip_rate tip_rate2 rnk
95 40.17 4.73 Male Yes Fri Dinner 4 0.117750 0.117750 1.0
90 28.97 3.00 Male Yes Fri Dinner 2 0.103555 0.103555 2.0
170 50.81 10.00 Male Yes Sat Dinner 3 0.196812 0.196812 1.0
212 48.33 9.00 Male No Sat Dinner 4 0.186220 0.186220 2.0
156 48.17 5.00 Male No Sun Dinner 6 0.103799 0.103799 1.0
182 45.35 3.50 Male Yes Sun Dinner 3 0.077178 0.077178 2.0
197 43.11 5.00 Female Yes Thur Lunch 4 0.115982 0.115982 1.0
142 41.19 5.00 Male No Thur Lunch 5 0.121389 0.121389 2.0
3、SUM()
SQL语法:
SELECTt.*,SUM() OVER(PARTITION BY day) AS snFROM data t;
In :data['sn'] = data.groupby('day')['total_bill'].cumsum()
In :data
Out :total_bill tip sex smoker day time size tip_rate tip_rate2 sn
0 16.99 1.01 Female No Sun Dinner 2 0.059447 0.059447 16.99
1 10.34 1.66 Male No Sun Dinner 3 0.160542 0.160542 27.33
2 21.01 3.50 Male No Sun Dinner 3 0.166587 0.166587 48.34
3 23.68 3.31 Male No Sun Dinner 2 0.139780 0.139780 72.02
4 24.59 3.61 Female No Sun Dinner 4 0.146808 0.146808 96.61
... ... ... ... ... ... ... ... ... ... ...
239 29.03 5.92 Male No Sat Dinner 3 0.203927 0.203927 1710.73
240 27.18 2.00 Female Yes Sat Dinner 2 0.073584 0.073584 1737.91
241 22.67 2.00 Male Yes Sat Dinner 2 0.088222 0.088222 1760.58
242 17.82 1.75 Male No Sat Dinner 2 0.098204 0.098204 1778.40
243 18.78 3.00 Female No Thur Dinner 2 0.159744 0.159744 1096.33
相关文章:
pandas与sql对应关系【帮助sql使用者快速上手pandas】
本页旨在提供一些如何使用pandas执行各种SQL操作的示例,来帮助SQL使用者快速上手使用pandas。 目录 SQL语法一、选择SELECT1、选择2、添加计算列 二、连接JOIN ON1、内连接2、左外连接3、右外连接4、全外连接 三、过滤WHERE1、AND2、OR3、IS NULL4、IS NOT NULL5、B…...
Linux WEB漏洞
定义:Linux Web 漏洞是指在基于 Linux 操作系统的 Web 应用程序、Web 服务器软件或者相关的网络服务配置中存在的安全弱点。这些漏洞可能导致攻击者未经授权访问敏感信息、篡改网页内容、执行恶意代码,甚至完全控制服务器。 常见类型及原理 SQL 注入漏…...

音视频入门基础:RTP专题(2)——使用FFmpeg命令生成RTP流
通过FFmpeg命令可以将一个媒体文件转推RTP: ffmpeg -re -stream_loop -1 -i input.mp4 -c:v copy -an -f rtp rtp://192.168.0.102:5400 但是通过ffplay尝试播放上述产生的RTP流时会报错:“Unable to receive RTP payload type 96 without an SDP file …...

大语言模型预训练、微调、RLHF
转发,如有侵权,请联系删除: 1.【LLM】3:从零开始训练大语言模型(预训练、微调、RLHF) 2.老婆饼里没有老婆,RLHF里也没有真正的RL 3.【大模型微调】一文掌握7种大模型微调的方法 4.基于 Qwen2.…...

vue3后台系统动态路由实现
动态路由的流程:用户登录之后拿到用户信息和token,再去请求后端给的动态路由表,前端处理路由格式为vue路由格式。 1)拿到用户信息里面的角色之后再去请求路由表,返回的路由为tree格式 后端返回路由如下: …...

解决idea中无法拖动tab标签页的问题
1、按 Ctrl Alt S 打开设置,找到路径 File | Settings | Appearance & Behavior | Appearance 2、去掉勾选 Drag-and-drop with Alt pressed only 即可...

WMS仓库管理系统,Vue前端开发,Java后端技术源码(源码学习)
一、项目背景和建设目标 随着企业业务的不断扩展,仓库管理成为影响生产效率、成本控制及客户满意度的重要环节。为了提升仓库作业的透明度、准确性和效率,本方案旨在构建一套全面、高效、易用的仓库管理系统(WMS)。该系统将涵盖库…...

25/1/12 嵌入式笔记 学习esp32
了解了一下位选线和段选线的知识: 位选线: 作用:用于选择数码管的某一位,例如4位数码管的第1位,第2位) 通过控制位选线的电平(高低电平),决定当前哪一位数码管处于激活状…...

【NLP】ELMO、GPT、BERT、BART模型解读及对比分析
文章目录 一、基础知识1.1 Word Embedding(词嵌入)1.2 词嵌入模型1.3 神经网络语言模型NNLM 二、ELMO2.1 ELMO的提出2.2 ELMO核心思想2.3 ELMO的优缺点 三、GPT3.1 Transformer3.2 GPT简介3.3 GPT模型架构3.4 预训练及微调3.5 GPT和ELMO对比 四、BERT4.1…...
go语言学习(数组,切片,字符串)
字符串 如果里面存储的是汉字,那么其实就是存储的是UTF--8编码,所以一个字会对应多个字节.如果想要获取汉字的个数,可以使用rune,来处理unicode字符 length: utf8.RuneCountInString( s) 如果只使用len()获取的是字节的个数, 字符串的功能 1,获取字节长度 len(xx) 2,获取字…...

PM 实战 - 智能药盒PRD + 市场规模分析
写在前面 智能硬件 PRD 实例资源很少,Po下个人作品,假定前提为to Boss需求,目标在于覆盖产品设计核心部分(用户画像Persona、产品逻辑图、产品架构图、软件原型图、硬件低保真设计、用例Use Case、硬件标准)。不是申请…...
SQL刷题快速入门(二)
其他章节:SQL刷题快速入门(一) 承接上一章节,本章主要讲SQL的运算符、聚合函数、SQL保留小数的几种方式三个部分 运算符 SQL 支持多种运算符,用于执行各种操作,如算术运算、比较、赋值、逻辑运算等。以下…...

hive迁移后修复分区慢,怎么办?
我有1个30TB的分区表,客户给的带宽只有600MB,按照150%的耗时来算,大概要迁移17小时。 使用hive自带的修复分区命令(一般修复分区比迁移时间长一点),可能要花24小时。于是打算用前面黄大佬的牛B方案。 Hive增…...

代码随想录算法训练营day27
代码随想录算法训练营 —day27 文章目录 代码随想录算法训练营前言一、贪心算法理论基础二、455.分发饼干三、376. 摆动序列53. 最大子数组和总结 前言 今天是算法营的第27天,希望自己能够坚持下来! 今日任务: ● 贪心算法理论基础 ● 455.…...
python 代码使用 DeepXDE 库实现了一个求解二维非线性偏微分方程(PDE)的功能
import deepxde as dde import numpy as np import matplotlib.pyplot as plt import tensorflow as tf# 设置时空计算域 Lx 1 # x 范围从 0 到 1 Ly 1 # y 范围从 0 到 1 Lt 0.05 # t 范围从 0 到 0.05 geom dde.geometry.Rectangle([0, 0], [Lx, Ly]) # 空间域 timed…...
【Go】:深入解析 Go 1.24:新特性、改进与最佳实践
前言 Go 1.24 尚未发布。这些是正在进行中的发布说明。Go 1.24 预计将于 2025 年 2 月发布。本文将深入探讨 Go 1.24 中引入的各项更新,并通过具体示例展示这些变化如何影响日常开发工作,确保为读者提供详尽而有价值的参考。 新特性及改进综述 HTTP/2 …...
VUE3 一些常用的 npm 和 cnpm 命令,涵盖了修改源、清理缓存、修改 SSL 协议设置等内容。
以下是一些常用的 npm 和 cnpm 命令,涵盖了修改源、清理缓存、修改 SSL 协议设置等内容。 npm 常用命令 1. 修改 npm 源 更改为淘宝的 npm 镜像源(可以提高安装速度): bash复制代码 npm config set registry https://registry…...

【SpringBoot】@Value 没有注入预期的值
问题复现 在装配对象成员属性时,我们常常会使用 Autowired 来装配。但是,有时候我们也使用 Value 进行装配。不过这两种注解使用风格不同,使用 Autowired 一般都不会设置属性值,而 Value 必须指定一个字符串值,因为其…...

【STM32-学习笔记-6-】DMA
文章目录 DMAⅠ、DMA框图Ⅱ、DMA基本结构Ⅲ、不同外设的DMA请求Ⅳ、DMA函数Ⅴ、DMA_InitTypeDef结构体参数①、DMA_PeripheralBaseAddr②、DMA_PeripheralDataSize③、DMA_PeripheralInc④、DMA_MemoryBaseAddr⑤、DMA_MemoryDataSize⑥、DMA_MemoryInc⑦、DMA_DIR⑧、DMA_Buff…...
js实现一个可以自动重链的websocket客户端
class WebSocketClient {constructor(url, callback, options {}) {this.url url; // WebSocket 服务器地址this.options options; // 配置选项(例如重试间隔、最大重试次数等)this.retryInterval options.retryInterval || 1000; // 重试间隔&#…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...

376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...
多模态图像修复系统:基于深度学习的图片修复实现
多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...
作为测试我们应该关注redis哪些方面
1、功能测试 数据结构操作:验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化:测试aof和aof持久化机制,确保数据在开启后正确恢复。 事务:检查事务的原子性和回滚机制。 发布订阅:确保消息正确传递。 2、性…...