pandas和sql对照
文章目录
【注意】最后更新于 March 9, 2022,文中内容可能已过时,请谨慎使用。
本文参照了 Pandas与SQL对比 - 简书
数据集地址:chipotle.tsv
|
|
select
-
[]获取列
1
df[['order_id','quantity']]
-
loc获取行获取指定index值的行
1 2
print(df) df.loc[0]
-
iloc获取行获取指定行数的行
1 2
print(df) df.iloc[0]
-
loc获取列
1 2
print(df) df.loc[:,['item_name']]
-
iloc获取列
1 2
print(df) df.iloc[:,[0]]
where,distinct,limit
-
where
select * from df where quantity>1
1
df[df['quantity']>1]
-
distinct select distinct item_name from df
1
df['item_name'].unique()
-
limit select item_name from df limit 3
1
df['item_name'].head(3)
select distinct item_name from df limit 3
1
df['item_name'].unique()[0:3]
order by
-
sort_values
select * from df order by quantity
1
df.sort_values('quantity')
in和not in
-
isin
select * from df where item_name in (‘Nantucket Nectar’,‘Izze’) limit 3
1
df['item_name'].isin(['Nantucket Nectar','Izze'])
1
df[df['item_name'].isin(['Nantucket Nectar','Izze'])].head(3)
select * from df where item_name not in (‘Nantucket Nectar’,‘Izze’) limit 3
1
df[~df['item_name'].isin(['Nantucket Nectar','Izze'])].head(3)
group by
对应的是pandas groupby
pandas.DataFrame.groupby(by, axis, level, as_index, sort, group_keys, squeeze, observed)
-
count
select count(1) from df group by choice_description
1 2 3
dd=df.groupby('choice_description').size() dd.values d2=
1 2
dd=df.groupby('choice_description').size() dd
select choice_description,count(1) from df group by choice_description order by count(choice_description)
1 2
dd=df.groupby('choice_description').size().to_frame('size').reset_index().sort_values(['size'], ascending=[False]) dd
having
-
使用[]过滤
select choice_description,count(1) from df group by choice_description having count(1)>300
1 2
dd=df.groupby('choice_description').size().to_frame('size').reset_index() dd[dd['size']>1]
-
filter
1 2 3 4 5 6 7 8 9 10 11
def p_group(grouped_df,p_size): i=0 for key, item in grouped_df: if i>p_size: break print(grouped_df.get_group(key), "\n\n") i=i+1 dd=df.groupby('choice_description') p_group(dd,3) dd.filter(lambda g:g['quantity'].count()>1)
聚合函数
-
max,min,mean
select min(quantity),max(quantity),mean(quantity),median(quantity) from df
1
df.agg({'quantity':['min','max','mean','median']})
top N
-
head
先排序再取值
1
df.sort_values('quantity',ascending=False).head(3)
-
nlargest DataFrame.nlargest(n, columns, keep=‘first’)
1
df.nlargest(3,'quantity')
union
- concat
|
|
join
-
merge
pd.merge(left, right, how=‘inner’, on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=True, suffixes=('_x', ‘_y’), copy=True, indicator=False, validate=None)
参数说明:
left: 拼接的左侧DataFrame对象
right: 拼接的右侧DataFrame对象
on: 要加入的列或索引级别名称。 必须在左侧和右侧DataFrame对象中找到。 如果未传递且left_index和right_index为False,则DataFrame中的列的交集将被推断为连接键。
left_on:左侧DataFrame中的列或索引级别用作键。 可以是列名,索引级名称,也可以是长度等于DataFrame长度的数组。
right_on: 左侧DataFrame中的列或索引级别用作键。 可以是列名,索引级名称,也可以是长度等于DataFrame长度的数组。
left_index: 如果为True,则使用左侧DataFrame中的索引(行标签)作为其连接键。 对于具有MultiIndex(分层)的DataFrame,级别数必须与右侧DataFrame中的连接键数相匹配。
right_index: 与left_index功能相似。
how: One of ‘left’, ‘right’, ‘outer’, ‘inner’. 默认inner。inner是取交集,outer取并集。比如left:[‘A’,‘B’,‘C’];right[’‘A,‘C’,‘D’];inner取交集的话,left中出现的A会和right中出现的买一个A进行匹配拼接,如果没有是B,在right中没有匹配到,则会丢失。‘outer’取并集,出现的A会进行一一匹配,没有同时出现的会将缺失的部分添加缺失值。
sort: 按字典顺序通过连接键对结果DataFrame进行排序。 默认为True,设置为False将在很多情况下显着提高性能。
suffixes: 用于重叠列的字符串后缀元组。 默认为(‘x’,’ y’)。
copy: 始终从传递的DataFrame对象复制数据(默认为True),即使不需要重建索引也是如此。
indicator:将一列添加到名为_merge的输出DataFrame,其中包含有关每行源的信息。 _merge是分类类型,并且对于其合并键仅出现在“左”DataFrame中的观察值,取得值为left_only,对于其合并键仅出现在“右”DataFrame中的观察值为right_only,并且如果在两者中都找到观察点的合并键,则为left_only
1 2 3 4 5 6 7 8 9 10 11 12
d1=pd.DataFrame({ 'name':['张三','李四'], 'sex':[1,0] }) d2=pd.DataFrame({ 'name':['张三','王五'], 'age':[10,20] }) pd.merge(d1,d2,how='left',on='name')
insert
创建新的dataframe然后将两个合并达到类似的效果
|
|
update
-
使用loc
更新指定值
pandas.DataFrame.loc[condition, column_label] = new_value
update d3 set sex=1 where name=‘王五’
1 2 3
print(d3) d3.loc[d3['name']=='王五','sex']=1 d3
-
使用iloc
更新指定值
1 2 3
print(d3) d3.iloc[0,2]=100 d3
-
使用replace
按列值更新
df.replace([old_value], new_value)
update d3 set sex=-1 where sex=1
1 2 3
print(d3) d3['sex']=d3['sex'].replace(1,-1) d3
delete
-
drop
删除行和列
DataFrame.drop(labels=None,axis=0, index=None, columns=None, inplace=False)
参数说明:
labels 就是要删除的行列的名字,用列表给定
axis 默认为0,指删除行,因此删除columns时要指定axis=1
index 直接指定要删除的行
columns 直接指定要删除的列
inplace=False,默认该删除操作不改变原数据,而是返回一个执行删除操作后的新dataframe
inplace=True,则会直接在原数据上进行删除操作,删除后无法返回
1 2
print(d3) d3.drop(2)
1 2
print(d3) d3.drop('index',axis=1)
汇总
操作 | sql | pandas |
---|---|---|
查前n行 | limit n | head |
查指定列 | select 列名 | loc,iloc |
去重 | unique | distinct |
条件 | [df[‘列名’]>1] | where |
聚合 | group by | groupby |
连接 | merge | join |
重命名 | as | rename |
合并 | union all | concat |
排序 | order by | sort_values |
文章作者 lialzm
上次更新 2022-03-09