df = pd.read_csv( "tips.csv",encoding= "gbk")
df.head
结果如下:
Select数据查询
在SQL中,选择是使用您要选择的列(用逗号分隔)或(*选择所有列)来完成的。
SELECT'总费用', '小费', '是否吸烟', '吃饭时间'
FROMdf
LIMIT5;
对于pandas,通过将 列名列表传递给DataFrame来完成列选择。
df[[ '总费用', '小费', '是否吸烟', '吃饭时间']].head( 5)
结果如下:
注意:调用不带列名列表的DataFrame将显示所有列(称为SQL的*)。
在SQL中,您可以添加一个计算列:
SELECT*, "小费"/ "总费用"as"小费占比"
FROMdf
LIMIT5;
对于pandas,可以使用 DataFrame.assign的方法追加新列。
df.assign(小费占比=df[ '小费'] / df[ '总费用']) .head( 5)
结果如下:
Where按条件查询
通过WHERE子句在SQL中进行过滤。
SELECT*
FROMdf
WHERE吃饭时间 = '晚餐'
LIMIT5;
DataFrame可以通过多种方式进行过滤。 最直观的方法是使用布尔索引。
df[df[ '吃饭时间'] == '晚餐'].head( 5)
结果如下:
上面的语句只是 将Series的True / False对象传递给DataFrame,并返回所有带有True的行。
is_dinner= df[ '吃饭时间'] == '晚餐'
is_dinner.value_counts
df[is_dinner].head( 5)
结果如下:
就像SQL的OR和AND一样,可以使用|将多个条件传递给DataFrame。|(OR)和&(AND)。
SELECT*
FROMdf
WHERE吃饭时间 = '晚餐'AND小费 > 5.00;
那么,在DataFrame代码应该怎么写呢?
df[(df[ '吃饭时间'] == '晚餐') & (df[ '小费'] > 5.00)]
结果如下:
in和not in条件查询
我们先来看看在SQL中应该怎么做。
SELECT*
FROMdf
WHERE星期几 in(周四,周五)
LIMIT5;
对比到DataFrame中,我们再看看怎么做?
df[df["星期几"].isin([ '周四', '周五'])] .head( 5)
结果如下:
如果是not in,对比到DataFrame中, 直接使用取反操作(~)。
df[~df["星期几"].isin([ '周四', '周五'])] .head( 5)
结果如下:
group by分组统计
在Pandas中,SQL的GROUP BY操作是使用类似命名的groupby方法执行的。 groupby通常是指一个过程,在该过程中,我们希望将数据集分成多个组,应用某些功能(通常是聚合),然后将各组组合在一起。
常见的SQL操作是获取整个数据集中每个组中的记录数。例如,通过查询可以了解性别留下的提示数量。
SELECT"性别", count(*)
FROMdf
GROUPBY性别;
对比到DataFrame中,应该是这样的。
df.groupby( '性别') .size
结果如下:
注意, 在pandas代码中我们使用了size而不是count。这是因为count将函数应用于每一列,并返回每一列中的记录数。
df.groupby( '性别') .count
结果如下:
如果想要使用count方法应用于单个列的话,应该这样做。(后面需要随意选择一列)
df.groupby( '性别') ["总费用"].count
结果如下:
也可以一次应用多种功能。例如,假设我们要查看小费金额在一周中的各个天之间有何不同---> agg允许您将字典传递给分组的DataFrame,从而指示要应用于特定列的函数。
在SQL中:
SELECT星期几, AVG(小费), COUNT(*)
FROMdf
GROUPBY星期几;
在Dataframe中:
df.groupby( '星期几').agg({ '小费': np.mean, '星期几': np.size})
结果如下:
通过将一列列传递给方法,来完成按多个列分组groupby。
在SQL中:
SELECT是否吸烟, 星期几, COUNT(*), AVG(小费)
FROMtips
GROUPBY是否吸烟, 星期几;
在Dataframe中:
df.groupby([ '是否吸烟', '星期几']) .agg({'小费': [np.size, np.mean]})
结果如下:
join数据关联
可以使用join或merge执行JOIN。默认情况下,join将在其索引上联接DataFrame。 每个方法都有参数,可让您指定要执行的联接类型(LEFT,RIGHT,INNER,FULL)或要联接的列(列名或索引)。但是还是推荐使用merge函数。
1.数据准备
df1 = pd.DataFrame({ 'key': [ 'A', 'B', 'C', 'D'],
'value': [ 1, 3, 5, 7]})
df2 = pd.DataFrame({ 'key': [ 'B', 'D', 'D', 'E'],
'value':[ 2, 4, 6, 8]})
结果如下:
假设我们有两个数据库表, 它们的名称和结构与我们的DataFrames相同。现在让我们看一下各种类型的JOIN。
2.inner join内连接
在SQL中:
SELECT*
FROMdf1
INNERJOINdf2
ONdf1.key = df2.key;
在Dataframe中:
pd.merge(df1, df2, on= 'key')
结果如下:
3.left outer join左连接
在SQL中:
SELECT*
FROMdf1
LEFTOUTERJOINdf2
ONdf1.key = df2.key;
在Dataframe中:
pd.merge(df1, df2, on= 'key', how= 'left')
结果如下:
4.right join右连接
在SQL中:
SELECT*
FROMdf1
RIGHTOUTERJOINdf2
ONdf1.key = df2.key;
在Dataframe中:
pd.merge(df1, df2, on= 'key', how= 'right')
结果如下:
5.full join全连接
注意在MySQL中是不支持全连接的,一般是使用union完成这个操作的,这将在下面一个知识点中体现。
在Dataframe中:
pd.merge(df1, df2, on= 'key', how= 'outer')
结果如下:
union数据合并
UNION(ALL)操作在Dataframe中可以使用concat来执行。
1.数据准备
df1 = pd.DataFrame({ 'city': [ 'Chicago', 'San Francisco', 'New York City'],
'rank': range( 1, 4)})
df2 = pd.DataFrame({ 'city': [ 'Chicago', 'Boston', 'Los Angeles'],
'rank': [ 1, 4, 5]})
结果如下:
2.union all不去重合并
在SQL中:
SELECT city, rank
FROM df1
UNION ALL
SELECT city, rank
FROM df2;
"""
city rank
Chicago 1
San Francisco 2
New York City 3
Chicago 1
Boston 4
Los Angeles 5
"""
在Dataframe中:
#默认就是axis=0
pd.concat([df1, df2],axis=0)
结果如下:
3.union去重合并
在SQL中:
SELECT city, rank
FROM df1
UNION
SELECT city, rank
FROM df2;
-- notice that there isonly one Chicago record this time
"""
city rank
Chicago 1
San Francisco 2
New York City 3
Boston 4
Los Angeles 5
"""
在Dataframe中:
pd.concat( [df1, df2]) .drop_duplicates
结果如下:
取group分组后的Topn
在MySQL8.0以前的版本,可能是不支持窗口函数,因此求Topn可能有些费劲,以前的文章中已经提到过,这里也就没有多余的叙述。
有下面一堆数据,怎么求出Topn呢?
df = pd.DataFrame({ "name":[ "张三", "王五", "李四", "张三", "王五", "张三", "李四", "李四", "王五"],
"subject":[ "语文", "英语", "数学", "数学", "语文", "英语", "语文", "英语", "数学"],
"score":[ 95, 80, 83, 80, 90, 71, 88, 70, 78]})
df
结果如下:
在Dataframe中:
df.groupby([ "subject"]) .apply(lambda df:df.sort_values( "score",ascending=True))
结果如下:
本文为转载分享&推荐阅读,若侵权请联系后台删除