3.in和not in条件查询
我们先来看看在SQL中应该怎么做。
SELECT * FROM df WHERE 星期几 in (周四,周五) LIMIT 5;
对比到DataFrame中,我们再看看怎么做?
df[df["星期几"].isin(['周四','周五'])].head(5)
结果如下:
如果是not in,对比到DataFrame中,直接使用取反操作(~)。
df[~df["星期几"].isin(['周四','周五'])].head(5)
结果如下:
4.group by分组统计
在Pandas中,SQL的GROUP BY操作是使用类似命名的groupby()方法执行的。 groupby()通常是指一个过程,在该过程中,我们希望将数据集分成多个组,应用某些功能(通常是聚合),然后将各组组合在一起。
常见的SQL操作是获取整个数据集中每个组中的记录数。例如,通过查询可以了解性别留下的提示数量。
SELECT "性别", count(*) FROM df GROUP BY 性别;
对比到DataFrame中,应该是这样的。
df.groupby('性别').size()
结果如下:
注意,在pandas代码中我们使用了size()而不是count()。这是因为count()将函数应用于每一列,并返回每一列中的记录数。
df.groupby('性别').count()
结果如下:
如果想要使用count()方法应用于单个列的话,应该这样做。(后面需要随意选择一列)
df.groupby('性别')["总费用"].count()
结果如下:
也可以一次应用多种功能。例如,假设我们要查看小费金额在一周中的各个天之间有何不同—>agg()允许您将字典传递给分组的DataFrame,从而指示要应用于特定列的函数。
在SQL中:
SELECT 星期几, AVG(小费), COUNT(*) FROM df GROUP BY 星期几;
在Dataframe中:
df.groupby('星期几').agg({'小费': np.mean, '星期几': np.size})
结果如下:
通过将一列列传递给方法,来完成按多个列分组groupby()。在SQL中:
SELECT 是否吸烟, 星期几, COUNT(*), AVG(小费) FROM tips GROUP BY 是否吸烟, 星期几;
在Dataframe中:
df.groupby(['是否吸烟', '星期几']).agg({'小费': [np.size, np.mean]})
结果如下:
5.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 * FROM df1 INNER JOIN df2 ON df1.key = df2.key;
在Dataframe中:
pd.merge(df1, df2, on='key')
结果如下: