pandas和sql
1、查看全部数据或者前n行数据
2、查询特定列的数据
在pandas里可以使用中括号或者loc,iloc等多种方式进行列选择,可以选择一列或多列。loc方式可以直接写列名,iloc方式需要指定索引,即第几列。
SQL里只需写相应的列名即可。
3、查询特定列去重后的数据
pandas里有unique方法。
SQL里有distinct关键字。
pandas用nunique()方法实现,统计个数
4、查询带有1个条件的数据
pandas需要使用布尔索引的方式,指定条件时,可以指定等值条件,也可以使用不等值条件,如大于小于等。但一定要注意数据类型。
SQL中需要使用where关键字。
5、查询带有多个条件的数据
多个条件同时满足的情况
pandas需要使用&符号连接多个条件,每个条件需要加上小括号
SQL需要使用and关键字连接多个条件
多个条件满足其中一个的情况
pandas使用|符号表示一个条件满足的情况
SQL中则用or关键字连接各个条件表示任意满足一个
判断某字段是否为空值。pandas的空值用nan表示,其判断条件需要写成isna(),或者notna()。
MySQL相应的判断语句需要写成 is null 或者is not null。
6、group by聚合操作
使用group by时,通常伴随着聚合操作
求每个uid有多少订单量
pandas操作,count和size不去重,nunique去重
sql操作,加上distinct去重
求每个uid的订单数量和订单总金额
对结果的数据集进行重新命名
pandas可以使用rename方法,MySQL可以使用as 关键字进行结果的重命名。
7、join相关操作
join相关的操作有inner join,left join,right join,full join等。pandas中统一通过pd.merge方法,设置不同的参数即可实现不同的dataframe的连接。
pandas的merge函数传入4个参数,第一个是连接的主表,第二个是连接从表,第三个连接的key值,第四个是连接的方式,how为left时表示是左连接。
其他连接方式
如果要实现inner join,outer join,right join,pandas中相应的how参数为inner或者不填,outer,right。SQL也是同样直接使用对应的关键字即可。其中inner join 可以缩写为join。
8、union操作
union相关操作分为union和union all两种。二者通常用于将两份含有同样字段的数据纵向拼接起来的场景。但前者会进行去重。
一份order2的订单数据,包含的字段和order数据一致,想把两者合并到一个dataframe中
以上是没有去重的情况,如果想要去重,SQL需要用union关键字。而pandas则需要加上去重操作。
9、排序操作
pandas中的排序使用sort_values方法,SQl中的排序可以使用order_by关键字。
按照每个uid的订单数从高到低排序。这是在前面聚合操作的基础上的进行的。
pandas里,dataframe的多字段排序需要用by指定排序字段,SQL只要将多个字段依次卸载order by之后即可。
输出uid,订单数,订单金额三列,并按照uid降序,订单金额升序排列。
pandas
sql
10、case when 操作
将每个uid按照总金额分为[0-300),[300,600),[600,900),三组。
pandas
sql
pandas的这种分组操作有一种专门的术语叫“分箱”,相应的函数为cut,qcut,能实现同样的效果。
11、更新和删除操作
更新和删除都是要改变原有数据的操作。对于更新操作,操作的逻辑是:先选出需要更新的目标行,再进行更新。
pandas中,可以使用前文提到的方式进行选择操作,之后可以直接对目标列进行赋值。SQL中需要使用update关键字进行表的更新。
将年龄小于20的用户年龄改为20。
pandas
sql
删除操作可以细分为删除行的操作和删除列的操作。
例如删除年龄为30岁的用户
对于删除行操作,pandas的删除行可以转换为选择不符合条件进行操作。
SQL需要使用delete关键字。
对于删除列的操作。pandas需要使用drop方法。
SQL也需要使用drop关键字。
12、pandas实现where in
newDropList = [9,10,11,12,22,50,51,60,61]
newDB = newDB[newDB['groupId'].isin(newDropList)]
13、not in直接加一个" - " 号即可
newDropList = [9,10,11,12,22,50,51,60,61]
newDB = newDB[-newDB['groupId'].isin(newDropList)]
14、pands把dataframe或series转换成list
df = pd.DataFrame([3, 5, 6, 2, 4, 6, 7, 8, 7, 8, 9])
df.values.tolist()
把series转换为list
Series.tolist()
15、 pandas实现row_number()over()
'''
dataset: DataFrame格式数据集
partionby:分组依据字段
orderby:排序依据字段
asc:是否为升序;1:升序;0:降序
return series格式:序号
def row_number(dataset, partionby, orderby, asc):
return dataset[orderby].groupby(dataset[partionby]).rank(ascending=asc, method='first')
16、pandas.str.cat()函数
用给定的分隔符连接序列/索引中的字符串
Series.str.cat(others=None, sep=None, na_rep=None)
others:序列/索引,默认为None,如果为None则连接本身的元素 (用sep)
sep:不同元素/列之间的分隔符,默认情况下用空字符串
na_sep:为缺省值插入
可以看cat的源码中的例子