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
相关文章:
![](https://www.ngui.cc/images/no-images.jpg)
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…...
![](https://www.ngui.cc/images/no-images.jpg)
Linux WEB漏洞
定义:Linux Web 漏洞是指在基于 Linux 操作系统的 Web 应用程序、Web 服务器软件或者相关的网络服务配置中存在的安全弱点。这些漏洞可能导致攻击者未经授权访问敏感信息、篡改网页内容、执行恶意代码,甚至完全控制服务器。 常见类型及原理 SQL 注入漏…...
![](https://i-blog.csdnimg.cn/direct/45f22ee579e8480d9e0aed501504ec45.png)
音视频入门基础: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 …...
![](https://i-blog.csdnimg.cn/direct/448c2d1066014260a814b6a1015a5f8f.png)
大语言模型预训练、微调、RLHF
转发,如有侵权,请联系删除: 1.【LLM】3:从零开始训练大语言模型(预训练、微调、RLHF) 2.老婆饼里没有老婆,RLHF里也没有真正的RL 3.【大模型微调】一文掌握7种大模型微调的方法 4.基于 Qwen2.…...
![](https://i-blog.csdnimg.cn/direct/7f2aa44b65374e2b8510407d61d267bb.png)
vue3后台系统动态路由实现
动态路由的流程:用户登录之后拿到用户信息和token,再去请求后端给的动态路由表,前端处理路由格式为vue路由格式。 1)拿到用户信息里面的角色之后再去请求路由表,返回的路由为tree格式 后端返回路由如下: …...
![](https://i-blog.csdnimg.cn/direct/8a0bbd49d20a414f8de97d0a77118c76.png)
解决idea中无法拖动tab标签页的问题
1、按 Ctrl Alt S 打开设置,找到路径 File | Settings | Appearance & Behavior | Appearance 2、去掉勾选 Drag-and-drop with Alt pressed only 即可...
![](https://i-blog.csdnimg.cn/direct/0fa664f61809449c93ff682d6b8b35d7.png)
WMS仓库管理系统,Vue前端开发,Java后端技术源码(源码学习)
一、项目背景和建设目标 随着企业业务的不断扩展,仓库管理成为影响生产效率、成本控制及客户满意度的重要环节。为了提升仓库作业的透明度、准确性和效率,本方案旨在构建一套全面、高效、易用的仓库管理系统(WMS)。该系统将涵盖库…...
![](https://i-blog.csdnimg.cn/direct/c0bd22ec97b4424790b1842aa91acee9.png)
25/1/12 嵌入式笔记 学习esp32
了解了一下位选线和段选线的知识: 位选线: 作用:用于选择数码管的某一位,例如4位数码管的第1位,第2位) 通过控制位选线的电平(高低电平),决定当前哪一位数码管处于激活状…...
![](https://i-blog.csdnimg.cn/direct/f0311454ea414663a7aa6e47cbdf061b.png)
【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…...
![](https://www.ngui.cc/images/no-images.jpg)
go语言学习(数组,切片,字符串)
字符串 如果里面存储的是汉字,那么其实就是存储的是UTF--8编码,所以一个字会对应多个字节.如果想要获取汉字的个数,可以使用rune,来处理unicode字符 length: utf8.RuneCountInString( s) 如果只使用len()获取的是字节的个数, 字符串的功能 1,获取字节长度 len(xx) 2,获取字…...
![](https://i-blog.csdnimg.cn/direct/9159e15d8cd64a738a0b061b496a9b56.png#pic_center)
PM 实战 - 智能药盒PRD + 市场规模分析
写在前面 智能硬件 PRD 实例资源很少,Po下个人作品,假定前提为to Boss需求,目标在于覆盖产品设计核心部分(用户画像Persona、产品逻辑图、产品架构图、软件原型图、硬件低保真设计、用例Use Case、硬件标准)。不是申请…...
![](https://www.ngui.cc/images/no-images.jpg)
SQL刷题快速入门(二)
其他章节:SQL刷题快速入门(一) 承接上一章节,本章主要讲SQL的运算符、聚合函数、SQL保留小数的几种方式三个部分 运算符 SQL 支持多种运算符,用于执行各种操作,如算术运算、比较、赋值、逻辑运算等。以下…...
![](https://i-blog.csdnimg.cn/direct/0df0f4c1aac142a6a44907866ae83e79.png)
hive迁移后修复分区慢,怎么办?
我有1个30TB的分区表,客户给的带宽只有600MB,按照150%的耗时来算,大概要迁移17小时。 使用hive自带的修复分区命令(一般修复分区比迁移时间长一点),可能要花24小时。于是打算用前面黄大佬的牛B方案。 Hive增…...
![](https://i-blog.csdnimg.cn/direct/7aee8fa71e9b4d129d4b6ec75ea7cffd.png)
代码随想录算法训练营day27
代码随想录算法训练营 —day27 文章目录 代码随想录算法训练营前言一、贪心算法理论基础二、455.分发饼干三、376. 摆动序列53. 最大子数组和总结 前言 今天是算法营的第27天,希望自己能够坚持下来! 今日任务: ● 贪心算法理论基础 ● 455.…...
![](https://www.ngui.cc/images/no-images.jpg)
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…...
![](https://www.ngui.cc/images/no-images.jpg)
【Go】:深入解析 Go 1.24:新特性、改进与最佳实践
前言 Go 1.24 尚未发布。这些是正在进行中的发布说明。Go 1.24 预计将于 2025 年 2 月发布。本文将深入探讨 Go 1.24 中引入的各项更新,并通过具体示例展示这些变化如何影响日常开发工作,确保为读者提供详尽而有价值的参考。 新特性及改进综述 HTTP/2 …...
![](https://www.ngui.cc/images/no-images.jpg)
VUE3 一些常用的 npm 和 cnpm 命令,涵盖了修改源、清理缓存、修改 SSL 协议设置等内容。
以下是一些常用的 npm 和 cnpm 命令,涵盖了修改源、清理缓存、修改 SSL 协议设置等内容。 npm 常用命令 1. 修改 npm 源 更改为淘宝的 npm 镜像源(可以提高安装速度): bash复制代码 npm config set registry https://registry…...
![](https://i-blog.csdnimg.cn/direct/1392a29463334c718404b05820f35467.png)
【SpringBoot】@Value 没有注入预期的值
问题复现 在装配对象成员属性时,我们常常会使用 Autowired 来装配。但是,有时候我们也使用 Value 进行装配。不过这两种注解使用风格不同,使用 Autowired 一般都不会设置属性值,而 Value 必须指定一个字符串值,因为其…...
![](https://i-blog.csdnimg.cn/img_convert/999914bb6f27183fcb8d724a184125c4.png)
【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…...
![](https://www.ngui.cc/images/no-images.jpg)
js实现一个可以自动重链的websocket客户端
class WebSocketClient {constructor(url, callback, options {}) {this.url url; // WebSocket 服务器地址this.options options; // 配置选项(例如重试间隔、最大重试次数等)this.retryInterval options.retryInterval || 1000; // 重试间隔&#…...
![](https://i-blog.csdnimg.cn/direct/1f83243264654573ad5ea433298f0fb7.png)
企业总部和分支通过GRE VPN互通
PC1可以ping通PC2 1、首先按照地址表配置ip地址 2、分别在AR1和AR3上配置nat 3、配置GRE a 创建tunnel接口,并选择tunnel协议为GRE,为隧道创建一个地址,用作互联 b 为隧道配置源地址或者源接口,这里选择源接口;再为…...
![](https://i-blog.csdnimg.cn/direct/195b775d9e0a4e11a909e8f9063c738d.png)
油猴支持阿里云自动登陆插件
遇到的以下问题,都已在脚本中解决: 获取到的元素赋值在页面显示,但是底层的value并没有改写,导致请求就是获取不到数据元素的加载时机不定,尤其是弱网情况下,只靠延迟还是有可能获取不到,且登陆…...
![](https://i-blog.csdnimg.cn/direct/918242775f684d628b7dcf2ee74eb48c.png)
【2024年华为OD机试】(C卷,100分)- 字符串筛选排序 (Java JS PythonC/C++)
一、问题描述 题目描述 输入一个由N个大小写字母组成的字符串 按照ASCII码值从小到大进行排序 查找字符串中第K个最小ASCII码值的字母 (k > 1) 输出该字母所在字符串中的位置索引 (字符串的第一个位置索引为0) k如果大于字符串长度则输出最大ASCII码值的字母所在字符串…...
![](https://www.ngui.cc/images/no-images.jpg)
iOS - runtime总结
详细总结一下 Runtime 的核心内容: 1. 消息发送机制 // 消息发送的基本流程 id objc_msgSend(id self, SEL _cmd, ...) {// 1. 获取 isaClass cls object_getClass(self);// 2. 查找缓存IMP imp cache_getImp(cls, _cmd);if (imp) return imp(self, _cmd, ...);…...
![](https://i-blog.csdnimg.cn/img_convert/0ede82cc25798a0aebfb5d2927a2a678.png)
第33 章 - ES 实战篇 - MySQL 与 Elasticsearch 的一致性问题
思维导图 0. 前言 MySQL 与 Elasticsearch 一致性问题是老生常谈了。网上有太多关于这方面的文章了,但是千篇一律,看了跟没看没有太大区别。 在生产中,我们往往会通过 DTS 工具将 binlog 导入到 Kafka,再通过 Kafka 消费 binlog&…...
![](https://i-blog.csdnimg.cn/direct/59cffa2b60cf45b2a5f38743f4635abf.png#pic_center)
Artec Leo 3D扫描仪与Ray助力野生水生动物法医鉴定【沪敖3D】
挑战:捕获大型水生哺乳动物(如鲸鱼)的数据,搭建全彩3D模型,用于水生野生动物的法医鉴定、研究和保护工作。 解决方案:Artec Eva、Artec Space Spider、Artec Leo、Artec Ray、Artec Studio、CT scans 效果&…...
![](https://www.ngui.cc/images/no-images.jpg)
PythonQT5打包exe线程使用
打包: pyinstaller --noconsole --onefile test.py–noconsole 表示不需要打开命令行 修改:test.spec 一般项目里面需要用的资源文件,比如lib、png、exe等。 需要单独修改spec文件 pathex[.],binaries[(D:/test.png, .),(D:/simsun.ttc, .…...
![](https://i-blog.csdnimg.cn/direct/7aea041960ea4082ae89409024044ca0.png)
【Powershell】Windows大法powershell好(二)
PowerShell基础(二) 声明:该笔记为up主 泷羽的课程笔记,本节链接指路。 警告:本教程仅作学习用途,若有用于非法行为的,概不负责。 1. powershell 执行外部命令 powershell也可以执行一些外部的…...
![](https://www.ngui.cc/images/no-images.jpg)
前端学习-环境this对象以及回调函数(二十七)
目录 前言 目标 环境对象 作用 环境对象this是什么? 判断this指向的粗略规则是什么? 回调函数 目标 常见的使用场景 综合案例:Tab任务栏切换 总结 前言 男儿何不带吴钩,收取关山五十州 目标 能够分析判断函数运行在不…...
![](https://i-blog.csdnimg.cn/direct/4b7cecf72f3d4573a83ea9135498d3fc.png)
Element-plus、Element-ui之Tree 树形控件回显Bug问题。
需求:提交时,需要把选中状态和半选中状态 的数据id提交。如图所示: 数据回显时,会出现代码如下: <template><el-tree ref"treeRef" :data"tree" show-checkbox node-key"id" …...
![](/images/no-images.jpg)
app打包网站开发源码/模板网站建站公司
可靠性建模 编程By Rhea Moutafis瑞亚穆塔菲斯(Rhea Moutafis) Originally published on Aug. 25, 2020, on Hewlett Packard Enterprise’s Enterprise.nxt, publishing insights about the future of technology.最初于2020年8月25日在Hewlett Packard Enterprise的 Enterpr…...
![](/images/no-images.jpg)
网站建设首页图片插入/网站推广在哪好
arr.reduce(function(prev,cur,index,arr){ ... }, init);其中, arr 表示原数组; prev 表示上一次调用回调时的返回值,或者初始值 init; cur 表示当前正在处理的数组元素; index 表示当前正在处理的数组元素的索引,若提…...
![](https://img-blog.csdnimg.cn/20181222144741397.png)
北京做网站公司/关键词优化是什么工作
文章目录前言动态表和动态查询的概念动态表的时间属性引用前言 Fink在新发布的1.7版本中,不断完善和加强了SQL&Table API方面的功能支持。这使得在流计算过程中,用户同样能够运用熟悉的SQL语句来做数据处理,查询。但是相比于窗体的RDBMS而…...
![](/images/no-images.jpg)
个人网站源代码下载/室内设计培训
1.概述 RabbitMQ是一个消息中间件:它接受并转发消息。你可以把它当做一个快递站点,当你要发送一个包裹时,你把你的包裹放到快递站,快递员最终会把你的快递送到收件人那里,按照这种逻辑RabbitMQ是一个快递站,一个快递员…...
![](/images/no-images.jpg)
网站备案关闭/新手怎么做网络销售
“没有缘创派,可能我如今还在迷茫的找职业定位。”事隔七八年。当我昨天中午再次见到老朋友冉红宇的时候,他第一句话是这样说的。冉红宇,丰羽创业孵化器的合伙人。这个位于最知名的北京创业一条街上的孵化器,正在孵化三个项目。当…...
![](https://img-blog.csdnimg.cn/202001182213016.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dteTAyMTdf,size_16,color_FFFFFF,t_70)
福州建站服务/百度榜单
串的定义 串(string)(或字符串)是由零个或多个字符组成的有限序列,一般记为, s“a1,a2…an”(n≥0) n为字符串的长度零个字符的串称为空串,其长度也为0串中任…...