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的驅動=>
資料與分析來源:https://www.v2ex.com/t/497288
所以我就選擇了MySQL Connectors(反正領導讓我做一個自用專案 也沒啥特別要求。我想咋玩都可以),具體如何安裝看官方網址的文件就可以了。我這裡就不記了,覺得麻煩就pip install mysql-connector-python好了。
驅動選擇好了。那接下來如何連線呢。看pandas的文件是說建議使用ORM框架--SQLAlchemy作為MySql的engine。好吧,人家pandas都建議了那我們就用吧。SQLAlchemy的具體用法看官方文件就好了,反正有示例,一看就懂怎麼玩(其實主要原因有兩個,1是這篇部落格主要是記錄pandas的操作;2是我懶= =。改天我專門寫一篇來詳細介紹這貨吧)==》
解決了控制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
目前用到的就這些了,後面有用到其他的我在寫上。