pandas操作mysql从放弃到入门

目录

  • 什么是pandas
  • 一、如何读取数据库-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
  • 十五、如何进行可视化-plot

什么是pandas

pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。
Pandas纳入了大量库和一些标准的数据模型,提供了大量能使我们快速便捷地处理数据的函数和方法。
主要包含两种数据类型:Series和DataFrame

  • Series可以理解为dict的升级版本,主数组存放numpy数据类型,index数据存放索引
  • DataFrame相当于多维的Series,有两个索引数组,分别是行索引和列索引,可以理解成Series组成的字典

相关帮助文档

  • 十分钟入门教程
  • 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)

执行结果如下
pandas操作mysql从放弃到入门_第1张图片

二、如何筛选数据

  • 筛选创建时间大于某个时间点的记录
import datetime
log[log['create_time'] > '2020-01-15 16:14:22']

pandas操作mysql从放弃到入门_第2张图片

  • 筛选指定列的DataFrame
    直接传递数组给给DataFrame
logs[['user_id','type']]

pandas操作mysql从放弃到入门_第3张图片

  • 获取一列Series
logs['type']

pandas操作mysql从放弃到入门_第4张图片

  • iloc和loc
    iloc[行,列]是根据行号和列号获取,loc[行索引 ,列索引]是根据索引名获取
    pandas操作mysql从放弃到入门_第5张图片

三、如何连表-merge

现在我需要将user_id对应的用户名找出来,示例代码如下

#查询出所有的用户,以便将log和users做join
users:pd.DataFrame=pd.read_sql("SELECT * FROM users",engine)
users

pandas操作mysql从放弃到入门_第6张图片

  • 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')

pandas操作mysql从放弃到入门_第7张图片

四、如何删除一行或一列-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)

pandas操作mysql从放弃到入门_第8张图片

七、如何重建索引-groupby(as_index=False)/reset_index

默认groupby后的结果是行索引是groupby的字段

log.merge(users,how='left',left_on='user_id',right_on='id').groupby('type').count()

pandas操作mysql从放弃到入门_第9张图片
groupby指定参数as_index

log.merge(users,how='left',left_on='user_id',right_on='id').groupby('type',as_index=False).count()

pandas操作mysql从放弃到入门_第10张图片

另外,还可以count完后直接调用reset_index方法

log.merge(users,how='left',left_on='user_id',right_on='id').groupby('type').count().reset_index()

pandas操作mysql从放弃到入门_第11张图片

八、如何翻转dataframe-T

log.T

pandas操作mysql从放弃到入门_第12张图片

九、如何重命名列-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()

pandas操作mysql从放弃到入门_第13张图片

十二、如何操作时间-.dt.

例如,要将create_time转为YY-MM-DD格式,可以使用函数.dt.date

log['create_time'].dt.date

pandas操作mysql从放弃到入门_第14张图片
具体方法可以参考Series的API文档的Datetime操作

十三、如何操作字符串-.str.

例如,转为大写

log['type'].str.upper()

pandas操作mysql从放弃到入门_第15张图片
具体方法可以参考Series的API文档的字符串操作

十四、如何进行数据透视-pivot/pivot_table

简单的理解就是一个更高级的groupby功能

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')

pandas操作mysql从放弃到入门_第16张图片
pivot_table支持分组后再聚合操作

df = pd.DataFrame({"A": ["foo", "foo", "foo", "foo", "foo",
                          "bar", "bar", "bar", "bar"],
                    "B": ["one", "one", "one", "two", "two",
                          "one", "one", "two", "two"],
                    "C": ["small", "large", "large", "small",
                          "small", "large", "small", "small",
                          "large"],
                    "D": [1, 2, 2, 3, 3, 4, 5, 6, 7],
                    "E": [2, 4, 5, 5, 6, 6, 8, 9, 9]}
                 )

pandas操作mysql从放弃到入门_第17张图片
根据ABC分组,计算D的值,AB为行索引,C为列索引再使用sum函数,如下

df.pivot_table(values='D', index=['A', 'B'], columns=['C'], aggfunc=np.sum, fill_value=0)

pandas操作mysql从放弃到入门_第18张图片

十五、如何进行可视化-plot

一般使用matplotlib进行绘图
例如,统计所有的操作日志最多的前10个绘制直方图
先取出这些数据,如下

#获取所有操作类型最多的10条数据
countRes=log.groupby('type',as_index=False).count().drop(['create_time','project_id'],axis=1).rename({'user_id':'count'},axis=1).sort_values(by='count',ascending=False).head(10)

pandas操作mysql从放弃到入门_第19张图片
为了让图是递增的状态,我们反转一下

countRes=countRes.iloc[::-1]

再使用matplotlib绘制直方图

import matplotlib.pyplot as plt
plt.barh(countRes['type'],countRes['count'])

pandas操作mysql从放弃到入门_第20张图片

你可能感兴趣的:(pandas操作mysql从放弃到入门)