pandas与sql 对比,持续更新...

本文对比了pandas与SQL在数据操作上的相似之处,包括select、where、in、regexp、group by、order by、limit、case when、join、union all、distinct、多列运算、数据合并及删除特定条件列等操作,并提供了实际示例,适用于数据处理和分析场景。

由于工作关系 , 经常会用到sql和python的pandas模块,两者有很多相似之处,我将整理出系列的对比文章,并保持更新. 若有不尽之处,敬请指出.

官方文档地址:https://pandas.pydata.org/docs/getting_started/comparison/comparison_with_sql.html

1. 基础说明

本文代码环境基于windows 10 和 anaconda3创建的.python3.6虚拟环境

  • 下表的名字,在sql中数据叫table, 在pandas中叫df, 在一般的df中id这个字符是不显示的,在df中,这列叫做index
id colA colB colC colD
0 A X 100 90
1 A 50 60
2 B Ya 30 60
3 C Yb 50 80
4 A Xa 20 50

生成上表的语句是:
df = pd.DataFrame({'colA' : list('AABCA'), 'colB' : ['X',np.nan,'Ya','Xb','Xa'],'colC' : [100,50,30,50,20], 'colD': [90,60,60,80,50]})

2. select 操作

等效说明

sql操作(table)为数据表名 pandas操作(df)为DataFrame框架数据 说明
select * from table df
select colA,colB from table df.loc[:,['colA', 'colB']]df[['colA', 'colB']] 关键字: loc
脚注1.
1: 2018-08-09 新增df[['colA', 'colB']]方法

3. where操作

sql操作(table)为数据表名 pandas操作(df)为DataFrame框架数据 说明
select * from table where colA = 'B' df[df['colA']=='B'] 在DF中使用==表示两者比较关系
select * from table where colA = 'A' and colC = 50 df[(df['colA']=='A') & (df['colC'] == 50)] and操作用&符号,且&前后的语句需用()括起来
select colA, colC from table where colA='A' and colC=50 df=[['colA', 'colC']]; df2=df[(df['colA']=='A') & (df['colC'] == 50)] 需要进行两次赋值操作
select colA from table where colC>50 df = df.loc[df["colc"]>50, "colA"] 这个操作比较6
select * from table where colB is not null df[df['colB'].notna()] 关键词 isna()notna()两个方法。

4. in操作

sql操作(table)为数据表名 pandas操作(df)为DataFrame框架数据 说明
select * from table where colA in ('A','B') df[df['colA'].isin(['A','B'])] 关键字:isin
select * from table where colA not in ('A','B') df[~df['colA'].isin(['A','B'])] 关键字:~取反

5. regexp正则操作

因markdown使用不熟, 下表中的{竖线} 应替换为:|

sql操作(table)为数据表名 pandas操作(df)为DataFrame框架数据 说明
select * from table where colB regexp 'a{竖线}b' df[df['colB'].str.contains('a{竖线}b')] 关键字:str.contains
select * from table where colB not regexp 'a{竖线}b' df[~df['colB'].str.contains('a{竖线}b')] 关键字:~取反

6. group by操作

单独group by 没有意义 ,一般会和其它应用组合起来使用, 比如sql中的AVG(), COUNT(), SUM(), MAX()等函数,以后的工作中有更多的groupby操作,将会持续更新到这里.可以参考 我的另一文章

sql操作(table)为数据表名 pandas操作(df)为DataFrame框架数据 说明
select colA, sum(colC) from table group by colA df.groupby(['colA'])['colC'].sum().reset_index() 关键字:reset_index()的作用是将groupby后的index进行重置,以保持数据的二维表结构,
select colA, count(colC) from table group by colA df.groupby(['colA'])["colC"].count().reset_index() 关键字:count(),作用是计数, 同值会重复计数,
select colA, count(distinct colC) from table group by colA df.groupby(['colA']).agg({"colc": pd.Series.nunique})
### 使用 Python Pandas 进行实时数据分析 为了实现基于 Python Pandas 的实时数据分析,通常会涉及以下几个方面: #### 1. 实时数据获取 对于实时数据分析而言,首先要解决的是如何持续不断地从源头获取最新数据。这可能涉及到连接数据库、API 接口或其他形式的数据流服务。 当需要从 MySQL 数据库中读取最新的数据时,可以借助 `pymysql` 或者 `SQLAlchemy` 库来建立数据库之间的连接,并通过 SQL 查询语句提取所需的信息并加载至 DataFrame 中[^1]。 ```python import pandas as pd from sqlalchemy import create_engine engine = create_engine('mysql+pymysql://username:password@localhost/dbname') query = "SELECT * FROM table_name WHERE timestamp >= NOW() - INTERVAL 1 HOUR" df_realtime = pd.read_sql(query, engine) ``` #### 2. 动态更新 DataFrame 为了让 DataFrame 始终保持最新状态,在实际应用过程中往往采用定时任务的方式定期刷新数据集。可以使用像 `schedule` 或者 `APScheduler` 等调度工具设置固定的时间间隔执行上述查询操作从而达到动态维护的目的。 另一种方法是在接收到新事件触发的情况下立即向现有 DataFrame 添加记录,这种方式更适合处理增量式的日志类数据源。 #### 3. 数据预处理清洗 随着不断流入的新鲜样本加入进来之后,还需要对其进行必要的清理工作以确保后续分析的有效性准确性。比如去除重复项、填补缺失值以及转换字段格式等常规手段都可以在此阶段完成。 ```python # 删除完全相同的行 df_cleaned = df_realtime.drop_duplicates() # 对特定列中的空缺值填充平均数 mean_value = df_cleaned['column_with_missing'].mean() df_filled = df_cleaned.fillna({'column_with_missing': mean_value}) ``` #### 4. 即席探索性分析 (EDA) 一旦拥有了干净整洁的数据集合体,则可以根据业务需求开展各种类型的统计计算图形展示活动。例如绘制折线图观察趋势变化;制作柱状图对比不同类别间的差异等等。 考虑到中文字符的支持问题,在绘图前需做适当配置以便于更好地呈现结果给中国用户群体查看[^3]。 ```python import matplotlib.pyplot as plt plt.figure(figsize=(8, 6)) plt.plot(df_filled.index, df_filled['target_column']) plt.title('实时数据的趋势图表') plt.xlabel('时间戳') plt.ylabel('目标变量') plt.show() ```
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值