1. 程式人生 > >pandas操作mysql從放棄到入門

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)

執行結果如下

二、如何篩選資料

  • 篩選建立時間大於某個時間點的記錄
import datetime
log[log['create_time'] > '2020-01-15 16:14:22']

  • 篩選指定列的DataFrame
    直接傳遞陣列給給DataFrame
logs[['user_id','type']]

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

  • iloc和loc
    iloc[行,列]是根據行號和列號獲取,loc[行索引 ,列索引]是根據索引名獲取

三、如何連表-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

簡單的理解就是一個更高階的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')


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]}
                 )


根據ABC分組,計算D的值,AB為行索引,C為列索引再使用sum函式,如下

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

十五、如何進行視覺化-plot

一般使用matplotlib進行繪圖
例如,統計所有的操作日誌最多的前三個,繪製直方圖
先取出這些資料,如下

#獲取所有操作型別最多的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)


為了讓圖是遞增的狀態,我們反轉一下

countRes=countRes.iloc[::-1]

再使用matplotlib繪製直方圖

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

相關推薦

pandas操作mysql放棄入門

目錄 什麼是pandas 一、如何讀取資料庫-read_sql 二、如何篩選資料 三、如何連表-merge 四、如何刪除一行或一列-drop 五、如何分組統計-groupyby

MySQL入門放棄第一章:初涉

初涉mysql 本系列將會從0開始學習Mysql,大部分是理論加部分例項 學習目錄 - mysql預設埠 3306 - mysql超級使用者 root - 建立資料庫 C

MySQL入門放棄第三章:約束

約束 學習目錄 - 約束保證資料的完整行和一致性 - 約束按資料列的數目劃分: - 表級約束 - 列級約束 - 約束按功能劃分: - NOT NUL

轉-Vue.js2.0入門放棄---入門實例(一)

命令行 今天 初始化 手動 pre ref cnpm 簡單介紹 收藏 http://blog.csdn.net/u013182762/article/details/53021374 標簽: Vue.jsVue.js 2.0Vue.js入門實例Vue.js 2.0教

MySQL基礎知識(MySQL入門到精通觀後感)

alter mes times 值範圍 model 。。 字符編碼 不同的 精通 17/7/9 1.主從式架構(Client-server model)或客戶端-服務器(Client-Server)結構簡稱C/S結構,是一種網絡架構,通常在該網絡架構下軟件分為客戶端和服務器

vex 放棄入門

style detail one elf nts primitive spl color cnblogs 1.point 模式 int snpt = npoints(1); int spt_num = fit(ch("cur_pos"),0,1,0,snpt-1);

mysql 首次安裝後 簡單操作與語句 新手入門

首先cd到安裝目錄中bin路徑:這是我的安裝路徑以管理員身份開啟cmd(防止許可權不足)cd E:\>cd E:\mysql\mysql-5.5.40-winx64\bin 首次安裝需要輸入 mysqld.exe -install 啟動mysqlE:\mysql\mysql-5.5.40-

Linux C++操作mysql入門

一、初識與mysql相關的部分資料型別和api 1.1)  MYSQL:該結構代表一個數據庫的連線控制代碼,一般我們都不去複製它         MYSQL_RES:查詢返回的結果集   &

LVS+Keepalived實現MySQL庫讀操作負載均衡配置

password lob new 信息 如果 ldoc 負載均衡。 path ignore 轉載於osyunwei 說明: 操作系統:CentOS 5.X 64位 MySQL主服務器:192.168.21.126 MySQL從服務器:192.168.21.127,192.1

pandas操作Excel和MySql雜記

這篇部落格的內容是我這兩天利用pandas讀取excel和讀寫MySql時用到的一些函式功能。寫下來,免得以後再去百度上東找西找。 先說連線上mysql的問題吧,因為我是從琢磨這個問題開始的。首先,我用的是MySql8.0, Django2.0.6和Python3.6.4。本來打算用Djan

MySQL 入門到不是怎麼精通

一、索引 B+ Tree 原理 1. 資料結構 B Tree 指的是 Balance Tree,也就是平衡樹。平衡樹是一顆查詢樹,並且所有葉子節點位於同一層。 B+ Tree 是基於 B Tree 和葉子節點順序訪問指標進行實現,它具有 B Tree 的平

MySQL入門到上天(二、子查詢&多表查詢)

- 子查詢 DROP DATABASE mydb2; USE mydb1; CREATE TABLE emp(     empno        INT,     en

MySql一竅不通到入門(五)Sharding:分表、分庫、分片和分割槽

一、Sharding Sharding 是把資料庫橫向擴充套件(Scale Out)到多個物理節點上的一種有效的方式,其主要目的是為突破單節點資料庫伺服器的 I/O 能力限制,解決資料庫擴充套件性問題。Shard這個詞的意思是“碎片”。如果將一個數據庫當作一塊

查詢操作 -- Django入門到精通系列教程

該系列教程繫個人原創,並完整發布在個人官網劉江的部落格和教程 所有轉載本文者,需在頂部顯著位置註明原作者及www.liujiangblog.com官網地址。 查詢操作是Django的ORM框架中最重要的內容之一。我們建立模型、儲存資料為的就是在需要的時候可以查詢得到資料。Django自動為所有的模型提供了一

【 專欄 】- Python 操作elastic入門到精通

Python 操作elastic從入門到精通 在工作中,mongodb 的效能已經不能滿足業務需求,特別是需要構建搜尋推薦系統,對於很多用Python的同學,網上的Python操作elasticsearch的教程比較少,所以我我吧

mysql 資料庫快速入門 DML資料操作語言

目錄 DML:資料操作語言 檢視資料庫編碼 插入操作 更新操作 刪除操作 DML:資料操作語言 用來定義資料庫記錄(資料)DML是對表中的資料進行增、刪、改的操作。不要與DDL混淆了。 關鍵字:INSERT 、UPDATE、 DELETE 小知識:

mysql 資料庫快速入門 DDL:操作資料庫、表、列等

DDL:資料庫定義語言 用來定義資料庫物件:庫、表、列等。 使用的關鍵字:CREATE、 ALTER、 DROP 操作資料庫 建立資料庫 Create database mydb1; Create database mydb2 character set gbk; Creat

Vue.js2.0入門放棄---入門例項(三)

已經有幾周沒有更新部落格了,最近自己也在學習就沒有能及時抽身來寫部落格。 今天就來簡單說一下vue-resource,這是vue的一個與伺服器端通訊的HTTP外掛,用來從伺服器端請求資料。話不多說,直接上乾貨吧。 這裡PS一下,有人反映之前的程式碼下載下來,執行會報錯而

MySQL入門之C語言操作MySQL

基本概念 C APIs包含在mysqlclient庫檔案當中,與MySQL的原始碼一塊發行,用於連線到資料庫和執行資料庫查詢。 #include <stdio.h> #include <stdlib.h> #include &l

【QT】QT入門教程(五):影象檔案操作 [新建開啟儲存]

  前文已經講解了選單欄、工具欄、工作列的實現方法,下面我們對程式進行完善。實現功能為:為軟體新增“檔案”選單,並在下拉列表上新增”新建”、 ”開啟”、 ”儲存”、 ”另存為”、 ”關閉”,並在工具欄加上“新建”、“開啟”、“儲存”圖示。 程式碼 /