pandas操作mysql从放弃到入门
雪山飞猪 人气:2目录
- 相关帮助文档
- 一、如何读取数据库-read_sql
- 二、如何筛选数据
- 三、如何连表-merge
- 四、如何删除一行或一列-drop
- 五、如何分组统计-groupyby
- 六、如何排序-sort_values/sort_index
- 七、如何重建索引-groupby(as_index=False)/reset_index
- 八、如何翻转dataframe-T
- 九、如何重命名列-rename
- 十、如何强制转换类型-astype
- 十一、groupby只有一列时如何count-size
- 十二、如何操作时间-.dt.
- 十三、如何操作字符串-.str.
- 十四、如何进行数据透视-pivot/pivot_table
相关帮助文档
- 十分钟入门教程
- DataFrame文档
- Series文档
一、如何读取数据库-read_sql
示例代码如下
from sqlalchemy import create_engine
import pandas as pd
username = '用户名'
password = '密码'
host = '连接地址'
db = '数据库'
port = 端口号
link = f'''mysql+pymysql://{username}:{password}@{host}:{port}/{db}?charset=utf8'''
engine = create_engine(link, pool_recycle=3600)
核心方法read_sql
log:pd.DataFrame = pd.read_sql("SELECT * FROM log ORDER BY id DESC ",engine)
执行结果如下
二、如何筛选数据
- 筛选创建时间大于某个时间点的记录
import datetime
log[log['create_time'] > '2020-01-15 16:14:22']
- 筛选指定列的DataFrame
直接传递数组给给DataFrame
logs[['user_id','type']]
- 获取一列Series
logs['type']
三、如何连表-merge
现在我需要将user_id对应的用户名找出来,示例代码如下
查询出所有的用户,以便将log和users做join
users:pd.DataFrame=pd.read_sql("SELECT * FROM users",engine)
users
- users和log的字段太多,先做一下筛选
log=log[['type','user_id','project_id','create_time']]
users=users[['id','username','real_name']]
执行join,使用merge方法,how指定左连,left_on指定左表使用的字段, right_on指定右表使用的字段
log.merge(users,how='left',left_on='user_id',right_on='id')
四、如何删除一行或一列-drop
drop方法,axis为0代表行,1代表列
renameRes.drop('创建时间',axis=1)
五、如何分组统计-groupyby
dropRes.groupby(['type','real_name']).count()
六、如何排序-sort_values/sort_index
by指定字段,ascending指定升序还是降序
log.sort_values(by='user_id',ascending=False)
七、如何重建索引-groupby(as_index=False)/reset_index
默认groupby后的结果是行索引是groupby的字段
log.merge(users,how='left',left_on='user_id',right_on='id').groupby('type').count()
groupby指定参数as_index
log.merge(users,how='left',left_on='user_id',right_on='id').groupby('type',as_index=False).count()
另外,还可以count完后直接调用reset_index方法
log.merge(users,how='left',left_on='user_id',right_on='id').groupby('type').count().reset_index()
八、如何翻转dataframe-T
log.T
九、如何重命名列-rename
使用rename方法,传递一个字典即可,如下
pd.DataFrame = res[['type','username','real_name','create_time']].rename({'create_time':'创建时间'},axis=1)
十、如何强制转换类型-astype
log['create_time'].astype(str)
十一、groupby只有一列时如何count-size
count是必须依赖其他列做统计的,当只有一列的时候如何还使用count,是看不出统计字段的,正确的方法应该是使用size
test4=pd.read_sql("SELECT `type` FROM log LIMIT 100",engine)
test4.groupby('type').size()
十二、如何操作时间-.dt.
例如,要将create_time转为YY-MM-DD格式,可以使用函数.dt.date
log['create_time'].dt.date
具体方法可以参考Series的API文档的Datetime操作
十三、如何操作字符串-.str.
例如,转为大写
log['type'].str.upper()
具体方法可以参考Series的API文档的字符串操作
十四、如何进行数据透视-pivot/pivot_table
简单的理解就是一个更高级的groupy功能
df = pd.DataFrame({'foo': ['one', 'one', 'one', 'two', 'two',
'two'],
'bar': ['A', 'B', 'C', 'A', 'B', 'C'],
'baz': [1, 2, 3, 4, 5, 6],
'zoo': ['x', 'y', 'z', 'q', 'w', 't']})
df.pivot(index='foo', columns='bar', values='baz')
加载全部内容