1. 程式人生 > >pandas操作Excel和MySql雜記

pandas操作Excel和MySql雜記

這篇部落格的內容是我這兩天利用pandas讀取excel和讀寫MySql時用到的一些函式功能。寫下來,免得以後再去百度上東找西找。

先說連線上mysql的問題吧,因為我是從琢磨這個問題開始的。首先,我用的是MySql8.0, Django2.0.6和Python3.6.4。本來打算用Django內建的Myqsl驅動來讀寫資料庫。所以找到了Django-pandas。但是找來找去發現這貨只能把QuerySet轉換成DataFrame,沒辦法轉換回去。不符合我的需求,所以棄用。

竟然Django的內建MySql驅動用不了,只能自己找了。我看網上很多人用PyMySQL和mysqlclient,但是我發現另外一個驅動,是MySQL官方寫的針對Python的驅動=>

MySQL Connectors(連線過去是MySQL)的官方網址。嗯..看起來很叼的樣子。想用這個,然後有繼續找文件。發現網上有大神測試過這3個驅動的速度。分別如下

三款MYSQL驅動測試結果

資料與分析來源:https://www.v2ex.com/t/497288

所以我就選擇了MySQL Connectors(反正領導讓我做一個自用專案 也沒啥特別要求。我想咋玩都可以),具體如何安裝看官方網址的文件就可以了。我這裡就不記了,覺得麻煩就pip install mysql-connector-python好了。

驅動選擇好了。那接下來如何連線呢。看pandas的文件是說建議使用ORM框架--SQLAlchemy作為MySql的engine。好吧,人家pandas都建議了那我們就用吧。SQLAlchemy的具體用法看官方文件就好了,反正有示例,一看就懂怎麼玩(其實主要原因有兩個,1是這篇部落格主要是記錄pandas的操作;2是我懶= =。改天我專門寫一篇來詳細介紹這貨吧)==》

SQLAlchemy1.3文件網址

解決了控制mysql的問題,那接下來說的就是pandas中我有用到的一些方法,分別列出來。以後有碰到其他的再追加寫上(編寫順序不分先後,各自獨立,只是寫了如何用,具體詳細引數我回頭在各自寫文章講解。不然這篇部落格寫不完,下午還得幹活呢):

操作前必備匯入模組

import pandas as pd
from sqlalchemy import create_engine
import mysql.connector as mysql_

讀取資料庫資料:

engine = create_engine('mysql+mysqlconnector://root:
[email protected]
_IP:3306/db_name') df = pd.read_sql('select * from table_name', engine)

讀取Excel(不管xls或者xlsx都無所謂):

返回DataFrame型別資料,header=1 的意思是標題選擇第二行,這種針對表格內標題那邊有1行以上的情況

excel = pd.read_excel("excel_path", header = 1)

刪除行(列也是用這個行數,只是引數是columns=['列名']

new_excel = csult.drop([row_index])

寫入資料庫:

df是指DataFrame,if_exists=“append”表示表存在的話就追加寫入,index是選擇是否將index列一起寫入資料庫

df.to_sql(name='table_name', con=engine, if_exists='append', index=False)

獲取DataFrame的行數和列數:

#獲取行列數元祖
df.shape
#獲取行數
df.shape[0]
#獲取列數
df.shape[1]

判斷指定列(或全部列)是否(全部)含有NaN(空值):

#判斷某列是否含有空值
df['col_name'].isnull().any()
#判斷某列是否全部都是空值
df['col_name'].isnull().all()
#判斷某幾列是否全部都是空值
df[['col_name','col_name']].isnull().all()
#判斷某幾列是否全部都是空值
df[['col_name','col_name']].isnull().any()
#該函式返回一個空值判斷的二維陣列(但是空值不是'',而是NaN)
df[['col_name','col_name']].isnull()

DataFrame插入列:

#這裡要注意,插入之後原df是不變,pandas會返回一個新的df
#在第1列後面插入標題為‘X’,的資料‘abc’(該列每行的資料都是‘abc’)
#如果每列要不同的資料的話可以先新建Series物件然後‘abc’替換成Series物件
df.insert(1, 'X', 'abc')

選擇多列:

#返回一個新的df
df[['col_name','col_name']]

替換指定列中的空值:

#指定某列的空值
df['col_name'].fillna('value')
#df中全部空值都替換掉
df.fillna('value')

資料替換:

#s是指Series物件,意思就是需要指定某一列或某一行
s.replace('old_value','new_value')
#替換多種數值
s.replace(['old_value','old_value'],['new_value','new_value'])

指定列的資料過濾:

#使用python的條件判斷格式即可
df[df['col_name'] > 0.5]

判斷DataFrame是否為空:

#為空返回True,否則返回False
df.empty

目前用到的就這些了,後面有用到其他的我在寫上。