Pandas模塊

前言:

最近公司有數據分析的任務,若是使用Python作數據分析,那麼對Pandas模塊的學習是必不可少的;html

本篇文章基於Pandas 0.20.0版本前端

話很少說社會你根哥!開幹!python

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pandas==0.20.0

 

1、數據分析須要的基本數據結構

數據統計、分析創建在二維表爲基礎數據結構之上,每一行稱爲1個Case,每1列成爲1個variable ;mysql

按列分析:分析每 1個變量的變化、趨勢、統計信息;web

按行分析:對case進行分組、歸類;正則表達式

 

2、Pandas讀取源數據

沒有數據 怎麼作分析呢?數據可能須要您本身建立,也多是其餘數據源,因此Pandas能夠從各類數據源中導入數據, EXCEL/ CSV/ 統計軟件/數據庫.....sql

 

1.手工創建數據框數據庫

import pandas as pd pd.options.display.max_rows=10 #配置最多輸出多少行

#新建數據庫框
df1=pd.DataFrame({ 'var1':1.0, 'var2':[5,2,0,1,3,1,4], 'var3':'張根' #常數
}) ''' var1 var2 var3 0 1.0 5 張根 1 1.0 2 張根 2 1.0 0 張根 3 1.0 1 張根 4 1.0 3 張根 5 1.0 1 張根 6 1.0 4 張根 '''
以列爲單位構造數據框
df1=pd.DataFrame(data=[[1,"test"],[2,"train"],[3,'test'],[4,'train']],columns=['var2','va3']) #columns 列
''' var2 va3 0 1 test 1 2 train 2 3 test 3 4 train '''
print(df1)
一行爲單位建立數據庫框

 

2.Pandas文件讀取json

Pandas提供了2個讀取文件方法,其中read_csv()能夠用於讀取文本文件,read_excel()用於讀取Excel格式文件;api

filepath_or_buffe: 打開文件路徑 sep: 設置列分隔符 ',' head: 設置從第幾行開始 usecols: 設置使用的列 na_values: 設置爲 NaN 缺失值

2.1 read_csv()

可讀取csv格式文件,默認以' ,' 分割爲 1列,注意read_csv()方法不只能夠讀取CSV格式的文件,它通用於文本文件的讀取

import pandas as pd pd.options.display.max_rows=10 #配置最多輸出多少行
 df1=pd.read_csv('univ.csv',encoding='gbk')  #注意文件名稱 1定要是英文
print(df1) ''' 名次 學校名稱 總分 類型 所在省份 所在城市 辦學方向 主管部門 0 1 北京大學 100.00 綜合 北京 北京市 中國研究型 教育部 1 2 清華大學 98.50 理工 北京 北京市 中國研究型 教育部 2 3 復旦大學 82.79 綜合 上海 上海市 中國研究型 教育部 3 4 武漢大學 82.43 綜合 湖北 武漢市 中國研究型 教育部 4 5 浙江大學 82.38 綜合 浙江 杭州市 中國研究型 教育部 .. ... ... ... .. ... ... ... ... 95 96 浙江師範大學 63.37 師範 浙江 金華市 區域特點研究型 浙江省 96 97 安徽大學 63.34 綜合 安徽 合肥市 區域研究型 安徽省 97 98 首都醫科大學 63.32 醫藥 北京 北京市 區域特點研究型 北京市 98 99 江南大學 63.31 綜合 江蘇 無錫市 區域特點研究型 教育部 99 100 山西大學 63.29 綜合 山西 太原市 區域研究型 山西省 '''
pd.read_csv()

有時候個人csv數據並不是來自*.csv文件而是來自API,莫慌;

import requests import pandas as pd from io import StringIO from micro_crm.update_name_script import obtain_token sa = { 'url': 'http://39.107.6.24:8107',  # 'https://vipcloud2.cloud.sensorsdata.cn',
    'project': 'production',  # 'zhupj',
    'username': 'admin', 'password': 'UF0d6O' } class ExcelHandler(object): def __init__(self,file='D:\數據埋點方案標準模板1.xlsx'): self.file_name=file self.excel= pd.ExcelFile(self.file_name) def parser_excel(self,sheet,ignore=1,*args,**kwargs): ''' :param sheet: #sheet名稱 :param args: #按照該列drop_nan :param kwargs: #{'excel列關包含的鍵字':'datafreme列的別名' } :return: df = obj.parser_excel('物品屬性值校驗表', 2, *['property_cn'], **{"property_cn": '名稱', "property_enum": '枚舉值'}) df = obj.parser_excel('item', 3, *['property_en'],**{"property_en": '屬性英文名', "property_cn": '屬性中文名', 'enumeration_value': "枚舉值","enumeration_flag": '須要進行枚舉值校驗的字段'}) ''' df = self.excel.parse(sheet,header=None) index_col = [] rows, cols = df.shape for col in range(cols): if sum(df[col].isin(list(kwargs.values()))) > 0: index_col.append(col) if not index_col: return pd.DataFrame() df = df[index_col] df.columns = list(kwargs.keys()) df = df.dropna(subset=args)[ignore:] return df class GoodsCheckHandler(ExcelHandler):#物品表
    def __init__(self,file='D:\數據埋點方案標準模板1.xlsx'): super().__init__(file='D:\數據埋點方案標準模板1.xlsx') def get_search_columns(self): item_df = obj.parser_excel('item', 3, *['property_en'], **{"property_en": '屬性英文名', "property_cn": '屬性中文名', 'enumeration_value': "枚舉值", "enumeration_flag": '須要進行枚舉值校驗的字段'}) filed_info=list(item_df.loc[item_df.enumeration_flag =="T"].property_en.values) filed_info.extend(['item_type','category'])#'item_id','item_type'爲固定的item表搜素列
        return filed_info def item_search_aip(self,**kwargs): params = { 'project': kwargs.get('project'), 'q':self.sql, 'format':'csv' #'csv',
 } headers = { 'sensorsdata-token':self.token, } site_url = kwargs.get('url') + '/api/sql/query' data = requests.get(url=site_url, params=params, headers=headers).text data=data.replace('\t',',') try: df=pd.read_csv(filepath_or_buffer=StringIO(data),usecols=self.get_search_columns(), encoding='utf-8') except Exception: print('解析API數據失敗,請檢查列名') df=pd.DataFrame() return df def get_search_column_values(self): fileds=','.join(self.get_search_columns()) sql = 'select {0} from items;'.format(fileds)#.format(fileds)
            self.sql=sql self.token=obtain_token(sa)['token'] df=self.item_search_aip(**sa) return df obj=GoodsCheckHandler() print(obj.get_search_column_values())
df=pd.read_csv(filepath_or_buffer=StringIO(data),usecols=self.get_search_columns(), encoding='utf-8')

 

 

 

2.2 read_excel()

讀取excle,以 ' tab' 分割爲1列

sheet_name:指定sheet名稱
df1=pd.read_excel('aa.xlsx',sheet_name=0,header=0)
read_excel()

循環遍歷excel對象

df = pd.read_excel(io="pandas.xlsx", header=None) for index, item in df.iterrows():#index:索引,每一行
    print(index,item)

 

class ExcelHandler(object): def __init__(self,file='D:\數據埋點方案標準模板1.xlsx'): self.file_name=file self.excel= pd.ExcelFile(self.file_name) def parser_excel(self,sheet,ignore=1,*args,**kwargs): ''' :param sheet: #sheet名稱 :param args: #按照該列drop_nan :param kwargs: #{'excel列關包含的鍵字':'datafreme列的別名' } :return: df = obj.parser_excel('物品屬性值校驗表', 2, *['property_cn'], **{"property_cn": '名稱', "property_enum": '枚舉值'}) df = obj.parser_excel('item', 3, *['property_en'],**{"property_en": '屬性英文名', "property_cn": '屬性中文名', 'enumeration_value': "枚舉值","enumeration_flag": '須要進行枚舉值校驗的字段'}) ''' df = self.excel.parse(sheet,header=None) index_col = [] rows, cols = df.shape for col in range(cols): if sum(df[col].isin(list(kwargs.values()))) > 0: index_col.append(col) if not index_col: return pd.DataFrame() df = df[index_col] df.columns = list(kwargs.keys()) df = df.dropna(subset=args)[ignore:] return df
打開Excel

 

 

 

 

 

2.3 read_sql()

讀取數據庫數據

sql:須要執行的sql / 要讀取的表名 con:sqlalchemy 建立的 數據庫鏈接名稱 index_col:做爲索引列 的列名 columns:顯示的列
import pandas as pd from sqlalchemy import create_engine pd.options.display.max_rows=10 #配置最多輸出多少行
mysql_con=create_engine('mysql+pymysql://webproject:xxxxxx1234@172.17.10.112:3306/web') oracle_conn=create_engine('oracle+cx_oracle://scott:tiger@172.16.22.16:1521/ecdb') data=pd.read_sql(sql='cmdb_worker_order',con=mysql_con,index_col='seach',columns=['id','initiator','alarm_time',]) ''' sql:須要執行的sql / 要讀取的表名 con:sqlalchemy 建立的 數據庫鏈接名稱 index_col:做爲索引列 的列名 ,columns:顯示的列 '''
print(data)
read_sql()

 

 3、Pandas 輸出數據

有輸入就得有輸出,如何把pandas讀取到的數據   輸出保存到外部文件?

 

1.輸出到.csv格式文件

import pandas as pd from sqlalchemy import create_engine pd.options.display.max_rows=10 #配置最多輸出多少行
mysql_con=create_engine('mysql+pymysql://webproject:xxxxxx1234@172.17.10.112:3306/web') oracle_conn=create_engine('oracle+cx_oracle://scott:tiger@172.16.22.16:1521/ecdb') data_frame=pd.read_sql(sql='cmdb_worker_order',con=mysql_con,index_col='seach',columns=['id','initiator','alarm_time',]) data_frame.to_csv(path_or_buf='zhanggen.csv',sep='|',columns=['id','initiator','alarm_time'],header=['ID','發起人','發起時間'],index=True,mode='w',encoding='utf-8') ''' path_or_buf: 寫入文件的路徑 columns: 寫入的列們,使用列表指定 header: 指定列名 index: 是否導出索引列(默認爲True) mode: Python 寫文件的模式 encoding: 指定編碼 '''
to_csv()

 

2.輸出到Excel文件

原來 把數據庫裏的數據  導出到Excel,還能夠這麼簡單!

import pandas as pd from sqlalchemy import create_engine pd.options.display.max_rows=10 #配置最多輸出多少行
mysql_con=create_engine('mysql+pymysql://webproject:xxxxxx1234@172.17.10.112:3306/web') oracle_conn=create_engine('oracle+cx_oracle://scott:tiger@172.16.22.16:1521/ecdb') data_frame=pd.read_sql(sql='cmdb_worker_order',con=mysql_con,index_col='seach',columns=['id','initiator','alarm_time',]) data_frame.to_excel(excel_writer='zhanggen.xlsx',sheet_name='工單數據' ,columns=['id','initiator','alarm_time'],header=['ID','發起人','發起時間'],index=True,encoding='utf-8') ''' excel_writer: Excel路徑 sheet_name: 指定Excel中sheet名稱 columns: 寫入的列們,使用列表指定 header: 指定列名 index: 是否導出索引列(默認爲True) encoding: 指定編碼 '''
to_excel()

 

追加寫

startrow=指定從第幾行開始寫

s_df.to_excel(excel_writer=writer, sheet_name='事件表&物品表match校驗', index=False,encoding='utf-8',columns=['os','app_version','event','probability'],header=['應用操做系統','應用版本號','事件名稱','拼表成功率'])#,startrow=10
us_df.to_excel(excel_writer=writer, sheet_name='事件表&物品表match校驗', index=False,encoding='utf-8',startrow=len(s_df)+10,columns=['os','app_version','event','item_type','e_item_id'], header=['應用操做系統','應用版本號','事件名稱','事件表中item_type名稱','事件表中item_id'])#,startrow=10 writer.save() writer.close()

 

 

3.輸出到數據庫

原來pandas還能夠作數據庫備份!原來把Excel數據導入數據裏面也如此簡單!

確保數據 主鍵不重複!

import pandas as pd from sqlalchemy import create_engine pd.options.display.max_rows=10 #配置最多輸出多少行
mysql_con=create_engine('mysql+pymysql://webproject:xxxxxx1234@172.17.10.112:3306/web') backup_mysql_con=create_engine('mysql+pymysql://webproject:web@192.168.1.18:3306/web') oracle_conn=create_engine('oracle+cx_oracle://scott:tiger@172.16.22.16:1521/ecdb') data_frame=pd.read_sql(sql='cmdb_worker_order',con=mysql_con,index_col='seach',columns=['id','initiator','alarm_time',]) data_frame.to_sql(name='cmdb_worker_order',con=backup_mysql_con,if_exists='replace',index=True,) ''' name: 表名 con: 數據庫鏈接對象 if_exists: fail 若是表已經存在:fail 不作任何處理 replace 刪除原表重建新表 append 在原表以後插入新數據 index :是否導出索引 True '''
to_sql()

 

4.輸出爲HTML文件 

如何把一個個Excel文件,經過 前端網頁顯示出來呢?

import pandas as pd bj08=pd.read_csv(filepath_or_buffer='PM25\Beijing_2008_HourlyPM2.5_created20140325.csv',header=2,usecols=[0,2,3,4,5,6,7,9,10]) bj09=pd.read_csv(filepath_or_buffer='PM25\Beijing_2009_HourlyPM25_created20140709.csv',header=2,usecols=[0,2,3,4,5,6,7,9,10]) bj10=pd.read_csv(filepath_or_buffer='PM25\Beijing_2010_HourlyPM25_created20140709.csv',header=2,usecols=[0,2,3,4,5,6,7,9,10]) bj11=pd.read_csv(filepath_or_buffer='PM25\Beijing_2011_HourlyPM25_created20140709.csv',header=2,usecols=[0,2,3,4,5,6,7,9,10]) bj12=pd.read_csv(filepath_or_buffer='PM25\Beijing_2012_HourlyPM2.5_created20140325.csv',header=2,usecols=[0,2,3,4,5,6,7,9,10]) bj13=pd.read_csv(filepath_or_buffer='PM25\Beijing_2013_HourlyPM2.5_created20140325.csv',header=2,usecols=[0,2,3,4,5,6,7,9,10]) bj14=pd.read_csv(filepath_or_buffer='PM25\Beijing_2014_HourlyPM25_created20150203.csv',header=2,usecols=[0,2,3,4,5,6,7,9,10]) bj15=pd.read_csv(filepath_or_buffer='PM25\Beijing_2015_HourlyPM25_created20160201.csv',header=2,usecols=[0,2,3,4,5,6,7,9,10]) bj16=pd.read_csv(filepath_or_buffer='PM25\Beijing_2016_HourlyPM25_created20170201.csv',header=2,usecols=[0,2,3,4,5,6,7,9,10]) bj=bj08.append(other=[bj09,bj10,bj11,bj12,bj13,bj14,bj15,bj16],ignore_index=True,verify_integrity=True) print(bj.to_html())
to_html()

 

5.輸出爲json數據

居然還能夠把dataframe轉成josn數據

xls = pd.ExcelFile('pandas.xlsx') df = xls.parse( header=None) df.columns=['name','age','gender'] # df=df.to_json(orient="records")
print(df.to_json())
to_json()

 

 

4、DataFrame普通列操做

數據清洗是什麼?就是修改一下列名、修改一下列的數據類型。。。。。。。。。

1.查看datafreme數據

Pandas讀取到的數據以後 會把數據轉換成DataFrame數據類型

import pandas as pd from sqlalchemy import create_engine pd.options.display.max_rows=10 #配置最多輸出多少行
mysql_con=create_engine('mysql+pymysql://webproject:xxxxxx1234@172.17.10.112:3306/web') backup_mysql_con=create_engine('mysql+pymysql://webproject:web@192.168.1.18:3306/web') oracle_conn=create_engine('oracle+cx_oracle://scott:tiger@172.16.22.16:1521/ecdb') data_frame=pd.read_sql(sql='cmdb_worker_order',con=mysql_con,index_col='seach',columns=['id','initiator','alarm_time',]) print(data_frame.info()) ''' <class 'pandas.core.frame.DataFrame'> Index: 2434 entries, 201803280808 to 201901290053203724928934 Data columns (total 3 columns): id 2434 non-null int64 initiator 2434 non-null object alarm_time 2434 non-null object dtypes: int64(1), object(2) memory usage: 76.1+ KB None '''
data_frame.info()查看pandas dataframe的基本信息
import pandas as pd from sqlalchemy import create_engine pd.options.display.max_rows=10 #配置最多輸出多少行
mysql_con=create_engine('mysql+pymysql://webproject:xxxxxx1234@172.17.10.112:3306/web') backup_mysql_con=create_engine('mysql+pymysql://webproject:web@192.168.1.18:3306/web') oracle_conn=create_engine('oracle+cx_oracle://scott:tiger@172.16.22.16:1521/ecdb') data_frame=pd.read_sql(sql='cmdb_worker_order',con=mysql_con,index_col='seach',columns=['id','initiator','alarm_time',]) print(data_frame.head(8))# 瀏覽前8條
data_frame.head(8)查看前8行
import pandas as pd from sqlalchemy import create_engine pd.options.display.max_rows=10 #配置最多輸出多少行
mysql_con=create_engine('mysql+pymysql://webproject:xxxxxx1234@172.17.10.112:3306/web') backup_mysql_con=create_engine('mysql+pymysql://webproject:web@192.168.1.18:3306/web') oracle_conn=create_engine('oracle+cx_oracle://scott:tiger@172.16.22.16:1521/ecdb') data_frame=pd.read_sql(sql='cmdb_worker_order',con=mysql_con,index_col='seach',columns=['id','initiator','alarm_time',]) print(data_frame[6:18])  #dataframe 還支持切片
data_frame[6:18]切片獲取指定行
import pandas as pd from sqlalchemy import create_engine pd.options.display.max_rows=10 #配置最多輸出多少行
mysql_con=create_engine('mysql+pymysql://webproject:xxxxxx1234@172.17.10.112:3306/web') backup_mysql_con=create_engine('mysql+pymysql://webproject:web@192.168.1.18:3306/web') oracle_conn=create_engine('oracle+cx_oracle://scott:tiger@172.16.22.16:1521/ecdb') data_frame=pd.read_sql(sql='cmdb_worker_order',con=mysql_con,index_col='seach',columns=['id','initiator','alarm_time',]) print(data_frame.tail(8))# 瀏覽後8條
data_frame.tail(8)瀏覽後8條

 

2.修改列名稱

import pandas as pd pd.options.display.max_rows=10 #配置最多輸出多少行
data_frame=pd.read_csv(filepath_or_buffer='univ.csv',encoding='gbk') print(data_frame.columns) #查看datafreme的列屬性
data_frame.columns=['名次1', '學校名稱1', '總分1', '類型1', '所在省份1','所在城市1', '辦學方向1','主管部門1']#修改修屬性。
data_frame.rename(columns={'總分1':'總分6'},inplace=True) # 利用字典修改指定的列,inplace=True 直接修改元數據
print(data_frame.columns) data_frame.columns=['名次', '學校名稱', '總分', '類型', '所在省份','所在城市', '辦學方向','主管部門'] print(data_frame.columns)
重命名列

 

3.篩選列

import pandas as pd pd.options.display.max_rows=10 #配置最多輸出多少行
data_frame=pd.read_csv(filepath_or_buffer='univ.csv',encoding='gbk') # print(data_frame.名次)
print(data_frame[['所在省份','名次','學校名稱']])
列篩選

 

4.刪除列

import pandas as pd pd.options.display.max_rows=10 #配置最多輸出多少行
data_frame=pd.read_csv(filepath_or_buffer='univ.csv',encoding='gbk') d3=data_frame.drop(columns=['名次','主管部門'],inplace=False) #inplace=False 不修改源數據
del d3['名次','主管部門'] #直接刪除元數據列,儘可能少這麼幹
print(d3)
刪除列

 

5.列數據類型轉換

import pandas as pd pd.options.display.max_rows=10 #配置最多輸出多少行
data_frame=pd.read_csv(filepath_or_buffer='univ.csv',encoding='gbk') print(data_frame.dtypes) #查看列的 數據類型 object 字符串變量
print(data_frame.astype(dtype='str',copy=True,errors='raise').dtypes) print(data_frame.名次.astype(dtype='int',copy=True,errors='raise').dtypes)#修改指定列(名次列)
''' dtype: 指定轉成的數據類型 copy=True 是否生成新的副本,而不是替換原數據 errors="raise"/"ignore" 轉換時出錯誤是否拋出 raise,忽視ignore '''
列數據類型轉換

 

 

5、DataFrame索引列操做

只要數據量大了 就會 出現查詢慢的問題,所以Pandas的DataFrame數據也支持 經過索引加速

 

1.建立索引

全部的 data frame在創建的時候,自然擁有流水號(0、一、二、3.......)索引,所以這裏的 建立索引指定是 自定義索引列;

注意:即便是自定義的索引也 應當避免重複,雖然索引重複程序不會報錯,可是會影響數據分析過程;

建立DataDrame時手工建立索引列

import pandas as pd pd.options.display.max_rows=10 #配置最多輸出多少行 # data_frame=pd.read_csv(filepath_or_buffer='univ.csv',encoding='gbk')
 df1=pd.DataFrame({'年齡':18,'戰鬥力':[90,89,98,100,],'暱稱':['老狗','猴兒','大佔','豆兒'],'輩分':'小弟'}) print(df1) ''' 年齡 戰鬥力 暱稱 輩分 18 1 老狗 小弟 18 2 猴兒 小弟 18 3 大佔 小弟 18 4 豆兒 小弟 '''
#全部的 data frame在創建的時候,自然擁有流水號索引,所以這裏的 建立索引指定是 自定義索引,注意即便是自定義的索引也不能重複
df2=pd.DataFrame({'年齡':18,'戰鬥力':[90,89,98,100,],'暱稱':['老狗','猴兒','大佔','豆兒'],'輩分':'小弟'},index=[5,6,8,9]) print(df2) ''' 年齡 戰鬥力 暱稱 輩分 18 90 老狗 小弟 18 89 猴兒 小弟 18 98 大佔 小弟 18 100 豆兒 小弟 ''' 建立dataframe時創建索引
pd.DataFrame({'年齡':18,'戰鬥力':[90,89,98,100,],'暱稱':['老狗','猴兒','大佔','豆兒'],'輩分':'小弟'},index=[5,6,8,9])

數據讀取時建立索引列

 

import pandas as pd pd.options.display.max_rows=10 #配置最多輸出多少行
df1=pd.read_csv('univ.csv',encoding='gbk',index_col=['類型','學校名稱'])  #index_col=[指定索引列]
print(df1)
pd.read_csv('univ.csv',encoding='gbk',index_col=['類型','學校名稱'])

2.設置某列爲索引 

import pandas as pd pd.options.display.max_rows=10 #配置最多輸出多少行
df1=pd.read_csv('univ.csv',encoding='gbk') df2=df1.set_index(keys=['名次','學校名稱','總分'],drop=True,append=False,inplace=False) #設置['名次','學校名稱','總分']聯合索引,修改源文件
print(df2) ''' keys: 設置索引的列 drop=True: 創建索引以後是否刪除該列? append=False: 是否在原流水索引的基礎上添加索引,False默認是直接替換; inplace=False:是否直接替換原數據 '''
df.set_index

3.還原索引爲普通列

import pandas as pd pd.options.display.max_rows=10 #配置最多輸出多少行
df1=pd.read_csv('univ.csv',encoding='gbk') df2=df1.set_index(keys=['名次','學校名稱','總分'],drop=True,append=False,inplace=False) #設置['名次','學校名稱','總分']聯合索引,修改源文件
print(df2) df2.reset_index(level=['學校名稱','總分','名次'],drop=False,inplace=True) #還原['名次','學校名稱','總分']聯合索引,源文件生效
print(df2) ''' drop=True: True將該索引直接刪除?False還原爲普通列! inplace=False:是否直接修改原數據 level=[] :指定還原的索引列 '''
df.reset_index()

4.修改索引

修改索引名稱

import pandas as pd pd.options.display.max_rows=10 #配置最多輸出多少行
df1=pd.read_csv('univ.csv',encoding='gbk') df2=df1.set_index(keys=['名次','學校名稱','總分'],drop=True,append=False,inplace=False) print(df2.index.names) df2.index.names=[None,None,None]  #修改索引名稱
print(df2.index.names)
df2.index.names=[None,None,None]

修改索引值

索引值能夠所有替換,但不能修改。

import pandas as pd pd.options.display.max_rows=10 #配置最多輸出多少行
df1=pd.read_csv('univ.csv',encoding='gbk') df2=df1.set_index(keys=['名次','學校名稱','總分'],drop=True,append=False,inplace=False) df2.index=['a','b','c','d'] #修改索引值(必須一次性所有替換)
df2.index=['a','b','c','d']

5.強行更新索引 

經過df1.reindex() ,不加任何參數的方式還原全部索引列,沒法清除 index_col=[ ]設置的索引;

import pandas as pd pd.options.display.max_rows=10 #配置最多輸出多少行
df1=pd.read_csv('univ.csv',encoding='gbk')  #index_col=[指定索引列]
print(df1.set_index(['名次'])) print(df1.reindex()) #還原全部索引列(還原不了讀取 數據設置的 cl)
df1.reindex()

 

經過df1.reindex()填充缺失值

import pandas as pd pd.options.display.max_rows=10 #配置最多輸出多少行
df1=pd.read_csv('univ.csv',encoding='gbk')  #index_col=[指定索引列]
df2=df1.reindex([6,8,66,88,99,999999],fill_value='不知道') # 重置索引 [6,8,66,88,99,999999],取得原來索引對應的數據填入新表,999999號索引在原數據中沒有對應的數據,因此須要作填充操做;
print(df2) ''' 名次 學校名稱 總分 類型 所在省份 所在城市 辦學方向 主管部門 6 7.0 上海交通大學 81.76 綜合 上海 上海市 中國研究型 教育部 8 9.0 國防科學技術大學 80.31 理工 湖南 長沙市 中國研究型 中央軍委 66 67.0 合肥工業大學 64.88 理工 安徽 合肥市 行業特點研究型 教育部 88 89.0 中央民族大學 63.78 民族 北京 北京市 行業特點研究型 國家民委 99 100.0 山西大學 63.29 綜合 山西 太原市 區域研究型 山西省 999999 NaN NaN NaN NaN NaN NaN NaN NaN '''
#顯然 999999

'''' lables:[ ](列表結構的數值) copy=True:創建新對象而不是直接修改原數據 method:針對已經排序過的的索引 進行缺失值填充 method=pad / ffill: 用前面的有效數值填充 method=backfill /bfill: 用後面的有效數值填充 method=nearest: 使用最近的數值進行填充 fill_value='不知道' limit=None 設置向前、向後最大步長 '''
df1.reindex([6,8,66,88,99,999999],fill_value='不知道')

 

 

6、DataFrame行排序和篩選

一、排序

1.0. 根據索引排序:爲何要設置索引就是 便於快速排序、查詢!

import pandas as pd pd.options.display.max_rows=10 #配置最多輸出多少行
df1=pd.read_csv('univ.csv',encoding='gbk')  #index_col=[指定索引列]
df1.set_index(['類型','學校名稱'],inplace=True) #創建二重索引
df1.sort_index(level=['類型','學校名稱'],ascending=[True,False],na_position='last',inplace=True) ''' level:多重索引時,用於排序的級別號,和名稱 ascending=[True,False] 指定升序?降序?多列時以列表形式提供 na_position='last/first' 缺失值放在最前仍是最後 inplace=True 修改原數據框 '''
print(df1)
df1.sort_index(level=['類型','學校名稱'],ascending=[True,False],na_position='last',inplace=True)

1.1.根據變量值(列名稱)進行排序:若是沒有設置索引,也須要對數據進行排序,那麼只能使用變量值進行排序了,雖然相比索引排序會較慢;

import pandas as pd pd.options.display.max_rows=10 #配置最多輸出多少行
df1=pd.read_csv('univ.csv',encoding='gbk')  #index_col=[指定索引列]
df1.sort_values(by=['類型','學校名稱'],axis=0,ascending=[True,False],na_position='last',inplace=True) ''' by: 多重索引時,用於排序的變量名稱 ascending=[True,False] 是否爲升序排序? na_position='last/first' 設置缺失值 排列的順序 最前 仍是最後 inplace=True 是否對原數據框進行修改? '''
print(df1)
df1.sort_values(by=['類型','學校名稱'],axis=0,ascending=[True,False],na_position='last',inplace=True)

 

2.篩選

Pandas全部篩選都是基於 對行、列 設置 True/ False 值,True的是命中的、False的是爲未命中的不顯示的;

 

import pandas as pd pd.options.display.max_rows=10 #配置最多輸出多少行
df1=pd.read_csv('univ.csv',encoding='gbk') setlist=[True,False,True,True,False,True] print(df1.iloc[setlist]) ''' 名次 學校名稱 總分 類型 所在省份 所在城市 辦學方向 主管部門 0 1 北京大學 100.00 綜合 北京 北京市 中國研究型 教育部 True 2 3 復旦大學 82.79 綜合 上海 上海市 中國研究型 教育部 True 3 4 武漢大學 82.43 綜合 湖北 武漢市 中國研究型 教育部 True 5 6 中國人民大學 81.98 綜合 北京 北京市 中國研究型 教育部 True '''
全部篩選的本質都基於 設置(行、列的)True/False 值進行的篩選的;

 

2.0. 絕對位置篩選:按照行、列的絕對位置進行篩選

import pandas as pd pd.options.display.max_rows=10 #配置最多輸出多少行
df1=pd.read_csv('univ.csv',encoding='gbk') #iloc 即integer location 按照行、列序號進行檢索,支持同時指定行列,指定列時須要先用","表名列序號
print(df1.iloc[0:3])               #篩選前3行
print(df1.iloc[[0,3]])             #篩選第 0行 和第3行
print(df1.iloc[:,0:3])             #篩選全部行(:)的的 第0 - 3列
print(df1.iloc[[1,4],0:3])         #篩選第 一、4行 的 第0 - 3列
print(df1.iloc[ [1,4],[0,3] ])     #篩選第 一、4行 的 第0、3列
print(df1.iloc[ 1:4,[0,3] ])         #篩選第 1到4行 的 第0、3列
df1.iloc[0:3]

 

2.1.按照索引值進行篩選

df.loc

根據索引位置進行切片操做

import pandas as pd pd.options.display.max_rows=10 #配置最多輸出多少行
df1=pd.read_csv('univ.csv',encoding='gbk') print(df1.loc[2:4]) # 設置名次列爲索引列,獲取索引爲2 -- 索引爲4 的行
df1.loc[2:4]
import pandas as pd pd.options.display.max_rows=10 #配置最多輸出多少行
df1=pd.read_csv('univ.csv',encoding='gbk') df1.set_index(keys=['學校名稱'],inplace=True) print(df1.loc['北京大學':'復旦大學'])  #以 學校名稱列爲索引,獲取 從北京大學-----復旦大學的行
df1.loc['北京大學':'復旦大學']

 

根據索引篩選指定行

import pandas as pd pd.options.display.max_rows=10 #配置最多輸出多少行
df1=pd.read_csv('univ.csv',encoding='gbk') df1.set_index(keys=['學校名稱'],inplace=True) print(df1.loc[['北京大學','清華大學',]])  #以 學校名稱列爲索引,僅獲取 [北京大學、清華大學] 行
df1.loc[['北京大學','清華大學',]]

根據索引篩選指定的行 和 列

import pandas as pd pd.options.display.max_rows=10 #配置最多輸出多少行
df1=pd.read_csv('univ.csv',encoding='gbk') df1.set_index(keys=['學校名稱'],inplace=True) print(df1.loc[['北京大學','清華大學',],['名次','所在省份']])  #以 學校名稱列爲索引,僅獲取 [北京大學、清華大學]行,僅獲取【名次','所在省份】列
df1.loc[['北京大學','清華大學',],['名次','所在省份']]

 

2.2 多重索引檢索

For example 現有中國大學名單,設置 「所在省份「,「學校名稱」2列爲多重索引;

利用多重索引進行檢索,場景有3: 

場景1:  僅使用1級索引

pd.options.display.max_rows=10 #配置最多輸出多少行
df1=pd.read_csv('univ.csv',encoding='gbk',index_col=['所在省份','學校名稱']) # 設置多重索引 index_col=【所在省份、學校名稱】
print(df1.loc[['河南','河北']])  #獲取在河北、河南省的大學
df1.loc[['河南','河北']]

場景2:  使用 下級(2...)級索引

import pandas as pd pd.options.display.max_rows=10 #配置最多輸出多少行
df1=pd.read_csv('univ.csv',encoding='gbk',index_col=['所在省份','學校名稱']) # 設置多重索引 index_col=【所在省份、學校名稱】
print(df1.xs(key='鄭州大學',level=1,drop_level=False)) #利用二級索引學校名稱 篩選出鄭州大學
''' 名次 總分 類型 所在城市 辦學方向 主管部門 所在省份 學校名稱 (多重索引) 河南 鄭州大學 62 65.01 綜合 鄭州市 區域研究型 河南省 '''
df1.xs(key='鄭州大學',level=1,drop_level=False)

場景3. 多重索引所有TM給我利用上

import pandas as pd pd.options.display.max_rows=10 #配置最多輸出多少行
df1=pd.read_csv('univ.csv',encoding='gbk',index_col=['所在省份','學校名稱']) # 設置多重索引 index_col=【所在省份、學校名稱】 # print(df1.loc[['河南','河北']]) #獲取在河北、河南省的大學
print(df1.loc[[('河南','解放軍信息工程大學'),('河北','燕山大學')]]) #利用多重索引完整檢索('所在省份','學校名稱)篩選出 河南的解放軍信息工程大學 河北的 燕山大學
df1.loc[[('河南','解放軍信息工程大學'),('河北','燕山大學')]]

 

2.3 條件篩選

篩選出 中國排名前10的大小

import pandas as pd pd.options.display.max_rows=10 #配置最多輸出多少行
df1=pd.read_csv('univ.csv',encoding='gbk') # 設置多重索引 index_col=【所在省份、學校名稱】
print( df1[df1.名次 < 11])  #篩選出 中國排名前10的大小
df1[df1.名次 < 11]

 

2.4 列表篩選

import pandas as pd pd.options.display.max_rows=10 #配置最多輸出多少行
df1=pd.read_csv('univ.csv',encoding='gbk') # 設置多重索引 index_col=【所在省份、學校名稱】
print(df1[df1.名次.isin([1,5,6,8])]) #篩選 名次爲 1,5,6,8 的行
print(df1[df1.所在省份.isin(['河北','河南'])]) #篩選 所在省份爲 '河北','河南' 的行
df1[df1.名次.isin([1,5,6,8])]

 索引列列表篩選

import pandas as pd pd.options.display.max_rows=10 #配置最多輸出多少行
df1=pd.read_csv('univ.csv',encoding='gbk',index_col='學校名稱') # 設置 學校名稱 爲索引列

print(df1[df1.index.isin(['鄭州大學'])])  #根據索引篩選 鄭州大學
df1[df1.index.isin(['鄭州大學'])]

 

2.5 多重條件聯合篩選

若是單一的條件篩選沒法知足篩選需求,能夠把多重條件聯合在一塊兒進行篩選,相似Django ORM裏面的 Q 查詢。

import pandas as pd pd.options.display.max_rows=10 #配置最多輸出多少行
df1=pd.read_csv('univ.csv',encoding='gbk',index_col='學校名稱') # 設置 學校名稱 爲索引列
df2=df1[df1.名次 > 80 ] print(df2[df2.所在省份.isin(['河北','河南'])]) print('\033[1;35m ----------------------------花式一些------------------------------------\033[0m') df3=df1[df1.名次 > 80 ] [df1[df1.名次 > 80 ].所在省份.isin(['河北','河南'])] print(df3)
多條件聯合篩選

 

2.6 Python條件表達式篩選 

聯合條件篩選,要麼一步步得引用變量,要麼級聯使用又容易致使語法錯誤;

Pandas有1中更加簡單、容易的篩選方式 經過Python的條件表達式篩選;

import pandas as pd pd.options.display.max_rows=10 #配置最多輸出多少行
df1=pd.read_csv('univ.csv',encoding='gbk',index_col='學校名稱') # 設置 學校名稱 爲索引列
capital='北京' city='上海' df2=df1.query('名次 > 10 and 名次 < 90 and 所在省份 not in [@capital,@city ]',inplace=False) print(df2)
df1.query()

 

 

7、DataFrame列操做

 

1.新增列

1.0.生成新列

import pandas as pd import numpy,math pd.options.display.max_rows=10 #配置最多輸出多少行
df1=pd.read_csv('univ.csv',encoding='gbk',index_col='學校名稱') # 設置 學校名稱 爲索引列
 df1['new_row']=df1.總分+df1.名次+1     #對列進行操做 新增1列
df1.new_row=numpy.sqrt(df1.new_row)     #求新增列的平方根
df1.new_row=numpy.sqrt(df1.new_row)     #求新增列的平方根
df1.new_row=df1.總分.apply(math.sqrt)+10 #使用math模塊計算平方根+10 apply
df1['new_row']=df1.總分+df1.名次+1

 

1.1.對單列進行函數運算 apply(函數)

#apply( 函數表達式):對單列進行函數運行
def m_head(tmpstr): return tmpstr[:1] df1.new_row=df1.所在省份.apply(m_head)
df1.new_row=df1.所在省份.apply(m_hea

 

from sqlalchemy import create_engine import matplotlib.pyplot as plt import matplotlib as mpl import datetime,time import pandas as pd mpl.use('Agg') mpl.rcParams['font.sans-serif'] = ['simhei'] mpl.rcParams['font.serif'] = ['simhei'] import seaborn as sns sns.set_style("darkgrid",{"font.sans-serif":['simhei','Droid Sans Fallback']}) # pd.options.display.max_rows = 10 # 配置最多輸出多少行


def later_work_pie(): mysql_con=create_engine('mysql+pymysql://webproject:xxxxxx1234@172.17.10.112:3306/web') data=pd.read_sql(sql='cmdb_worker_order',con=mysql_con,columns=['alarm_time','initiator','fault_category','is_late','agent']).query('fault_category in [1,2,3,4] and is_late == True',inplace=False) def Unified_time_format(time_str): time_str_list=time_str.split(' ') if len(time_str_list) != 2:  #2018.04.08 13.29.39 統一格式 2018.04.08_14:17:00
            n=time_str.replace('_', ' ').replace(':', '.') return n else: return time_str data['alarm_time']=data['alarm_time'].apply(Unified_time_format) df1 = data.set_index(pd.to_datetime(data['alarm_time'], format='%Y.%m.%d %H.%M.%S')) last_monday=(datetime.datetime.now() +datetime.timedelta(days=-7)).strftime("%Y-%m-%d %H:%M:%S") this_monday=datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") df1=df1[last_monday:this_monday] df=pd.value_counts(df1.agent) fig = plt.figure()                              #在任何繪圖以前,咱們須要一個Figure對象,能夠理解成咱們須要一張畫板才能開始繪圖。
    ax = fig.add_subplot(111)                       #添加每個 Axes能夠理解成爲真正能夠做畫的紙。
    ax.set_title('本週超時工單信息') # print(dict(zip(df.index,df)))
    lables=[ i+' 數量:'+str(v)  for i,v in dict(zip(df.index,df)).items() ] ax.pie(df,labels=lables,shadow = False,autopct ='%3.1f%%') plt.axis('equal') plt.savefig('/WorkOrderSystemData/plotings/late_work_order.png')  #保存爲圖片
使用apply()函數修正不規則的時間格式

 

1.2.對多列進行函數運算 applymap(函數表達式)

#applymap(函數表達式):對多列進行相同的函數運算
def rows_add(row1): return row1+1000

print(df1[['總分','名次']].applymap(rows_add))
print(df1[['總分','名次']].applymap(rows_add))

 

1.3.在指定位置 插入新的列

#在指定位置 插入新的列,zhuy
df2.insert(1,'nwe',df1.總分.apply(rows_add)) print(df2)
df2.insert(1,'nwe',df1.總分.apply(rows_add))

 

1.4.df.assign 不修改原 DataFreme,而是生成新的df

#df.assign 不修改原 DataFreme,而是生成新的df
df2=df1.assign(new=df1.總分.apply(rows_add))
df2=df1.assign(new=df1.總分.apply(rows_add))
import pandas as pd import numpy,math pd.options.display.max_rows=10 #配置最多輸出多少行
df1=pd.read_csv('univ.csv',encoding='gbk',index_col='學校名稱') # 設置 學校名稱 爲索引列
 df1['new_row']=df1.總分+df1.名次+1     #對列進行操做 新增1列
df1.new_row=numpy.sqrt(df1.new_row)     #求新增列的平方根
df1.new_row=numpy.sqrt(df1.new_row)     #求新增列的平方根
df1.new_row=df1.總分.apply(math.sqrt)+10 #使用math模塊計算平方根+10 apply



#apply( 函數表達式):對單列進行函數運行
def m_head(tmpstr): return tmpstr[:1] df1.new_row=df1.所在省份.apply(m_head) #applymap(函數表達式):對多列進行相同的函數運算
def rows_add(row1): return row1+1000

print(df1[['總分','名次']].applymap(rows_add)) #df.assign 不修改原 DataFreme,而是生成新的df
df2=df1.assign(new=df1.總分.apply(rows_add)) #在指定位置 插入新的列,zhuy
df2.insert(1,'nwe',df1.總分.apply(rows_add)) print(df2)
代碼

 

1.15.在最後的位置插入新的列 

successful_df.insert(len(successful_df.columns),'probability',[ successful_df_count/total_count for i in range(len(successful_df))])

 

 

2.列中內容替換

2.1.對應數值的替換

import pandas as pd import numpy,math pd.options.display.max_rows=10 #配置最多輸出多少行
df1=pd.read_csv('univ.csv',encoding='gbk') # 設置 學校名稱 爲索引列

#精確替換單個值
df1.loc[1,'所在城市']='鐵嶺' #索引爲3的行的 所在所在城市列 替換爲唐縣

#批量替換單個值
print(df1.replace('北京市','帝都',inplace=False)) #列表形式批量替換 多個值
print(df1.replace(['北京市','上海市'],['帝都','魔都'],inplace=False)) #字典形式
print(df1.replace({'北京市':"帝都",'上海市':"魔都"},inplace=False))
print(df1.replace('北京市','帝都',inplace=False))

 

2.2.指定範圍替換

import pandas as pd import numpy,math,re pd.options.display.max_rows=10 #配置最多輸出多少行
df1=pd.read_csv('univ.csv',encoding='gbk') # 設置 學校名稱 爲索引列
 df2=df1.replace(regex=r'.*大學',value='野雞大學') #正則表達式替換
正則df1.replace(regex=r'.*大學',value='野雞大學')
import pandas as pd import numpy,math,re pd.options.display.max_rows=10 #配置最多輸出多少行
df1=pd.read_csv('univ.csv',encoding='gbk') # 設置 學校名稱 爲索引列
 df2=df1.replace(regex=r'.*大學',value='野雞大學') #正則表達式替換
print(df2) df1.loc[0:2,'總分']=250           #將前兩行 總分列替換爲250 # print(df1)
df1.loc[df1.名次 < 10,'總分']=20  #將前10行的 總分列替換爲20 # print(df1.head(10))
df1.loc[df1.query('名次 < 10 and 類型 == "綜合"').index,'總分']=110 #將排名前10的類型等於綜總分修改成110 # print(df1)
df1.loc

 

2.3.啞變量轉換

虛擬變量(dummy variable),有的書上也稱啞變量、假變量。我我的更喜歡虛擬變量這個稱謂。由於「虛擬」這個詞直接表達出了這個變量的含義。 虛擬,是與真實相對的,表示這個變量不是一個真實的變量。好比性別,用0和1表示,這裏的0和1不是個真實的數值,而只是男和女的代碼。我能夠用0 和1表示,也能夠用1和2表示,還能夠用4和8表示,不管什麼數值均可以表示,只不過咱們習慣於用0和1表示而已。他們的差值也沒有任何實際意義,不能說男和女相差1-0=1。0和1僅僅是個代碼,這就是虛擬的含義。 現實中,虛擬變量通常用於多分類變量的不少狀況下。好比,若是自變量是血型,分A、B、O、AB型。若是...

import pandas as pd import numpy,math,re pd.options.display.max_rows=10 #配置最多輸出多少行
df1=pd.read_csv('univ.csv',encoding='gbk') # 設置 學校名稱 爲索引列 # print(pd.get_dummies(df1.類型,prefix='pre'))

print(pd.get_dummies(df1,columns=['類型'])) ''' data:但願轉換的數據框、變量列 prefix:啞變量名稱的前綴 prefix_sep:前綴和變量名稱之間的分隔符 '''
啞變量轉換

 

2.4.數值分段

相似於對學生成績作 優良中差劃分

import pandas as pd import numpy,math,re pd.options.display.max_rows=10 #配置最多輸出多少行
df1=pd.read_csv('univ.csv',encoding='gbk') # 設置 學校名稱 爲索引列
df1['cls']=pd.cut(df1.名次,bins=[1,3,7],right=False) #數據值變量分段
''' 名次 學校名稱 總分 類型 所在省份 所在城市 辦學方向 主管部門 cls 0 1 北京大學 100.00 綜合 北京 北京市 中國研究型 教育部 [1, 3) 1 2 清華大學 98.50 理工 北京 北京市 中國研究型 教育部 [1, 3) 2 3 復旦大學 82.79 綜合 上海 上海市 中國研究型 教育部 [3, 7) 3 4 武漢大學 82.43 綜合 湖北 武漢市 中國研究型 教育部 [3, 7) 4 5 浙江大學 82.38 綜合 浙江 杭州市 中國研究型 教育部 [3, 7) '''
print(df1.head(10))
df1['cls']=pd.cut(df1.名次,bins=[1,3,7],right=False)

 

8、DataFrame 數據框架管理

前面是對DataFrame的導入、索引、行、列的操做,下面主要講述的是對 DataFrame數據的拆分、分組、彙總、結構調整、連表操做;

 

1.分組拆分和彙總

1.0.分組

注意:若是上下2行相同就會合併爲1條記錄,因此groupby有去重的效果;

# #說明、公共屬性、自定義事件表=1個事件表
df = pd.read_excel(io="pandas.xlsx",header=None) df.columns = ['name','gender','age']#賦予變量給列
df1=df.groupby(['name'])['age'].unique() for value in df1.index.values: # if len(df1[value]) > 1:
        print(df1[value])
去重

 

 

 

 

 

 

 

顧名思義就是 MySQL中的 group by;

import pandas as pd import numpy,math,re pd.options.display.max_rows=10 #配置最多輸出多少行
df1=pd.read_csv('a.csv',sep='|') # 設置 個體ID 、年齡 爲索引列

print(df1.groupby('名稱').groups)     # .groupby進行分組,.groups查看分組狀況
print(df1.groupby('名稱').describe()) #分析 各組的每一個數值列 的計數,平均值,標準差,最小值,最大值以及較低的百分位。
print(df1.groupby(['名稱','ID']).mean()) #對 數據進行 多重分組,並對每一個求出 全部數字列的均值
print(df1.groupby(['類型']).get_group('農林').mean()) #獲取其中的一組,求均值


print(df1.groupby('名稱')['排名'].min())   #按名稱分組,求每組中 排名列 的 最小值
print(df1.groupby('名稱')['排名'].mean()) #按名稱分組,求每組中 排名列 的 均值
print(df1.groupby('名稱')['排名'].max())  #按名稱分組,求每組中 排名列 的 最大值
df1.groupby('名稱')

1.1.彙總

分組彙總如圖所示 就是 先拆分也就是分組,而後運用 pandas的API 對每組數據進求和、求平均.... 

Split--->Apply--->Combine

 

 

 

import pandas as pd import numpy,math,re pd.options.display.max_rows=10 #配置最多輸出多少行
df1=pd.read_csv('a.csv',sep='|') # 設置 個體ID 、年齡 爲索引列
 df2=df1.groupby('名稱') #1.split 分組
def mymean(x): return x.mean() print(df2.agg('count'))  #求每組的個數
print(df2.agg(['mean','median' ])) #求均數、中位數(涉及全部數值列)
df2.agg(mymean)                      #自定義分組函數
.agg 拆分以後的彙總操做

 

 2.長形格式和寬形格式相互轉換

2.0.什麼是長形格式和寬形格式?

長形格式:每1個個體的 每1次測量都會被單獨 記錄爲1個 Case(行),有幾回測量就會有幾行!

特徵:同1個個體的信息會重複出現

寬形格式:每一個個體被記錄爲1個case,不一樣的測量指標被記錄爲不一樣的變量

特徵:1個個體的信息不會重複出現

 

2.1.長形和寬形格式如何相互轉換?

import pandas as pd import numpy,math,re pd.options.display.max_rows=10 #配置最多輸出多少行
df1=pd.read_excel('children.xlsx',index_col=[0,2]) #Pandas基於多重索引,作長形和寬形相互轉換
df2=df1.stack() #轉換成最簡的 多重索引模式 #print(df2.unstack(level=1)) # level=你要unstack 的索引級別(也就是把那列 進行分組 展開變成列) # print(df2.unstack([1,2])) #把 level 1的年齡列和 性別 測量值都展開變成列 # print(df1.T) #數據轉置(列變行)
print(df2.unstack([1,2]))

 

3.多數據源的合併

如何把2個或者多個 Excel文件、CSV文件在Pandas中合併起來呢?讀取了數據庫中的2中有外鍵關係的表如何進行連表呢?

 

3.0.縱向合併

縱向合併就是把 用有相同列屬性 的數據上下合併在一塊兒;

import pandas as pd import numpy,math,re from sqlalchemy import create_engine import matplotlib.pyplot as plt import matplotlib as mpl mpl.rcParams['font.sans-serif'] = ['KaiTi'] mpl.rcParams['font.serif'] = ['KaiTi'] pd.options.display.max_rows=50 #配置最多輸出多少行
df1=pd.read_csv('a.csv',sep='|') df2=pd.read_csv('b.csv',sep='|') # print(df1.append(other=df2,ignore_index=True,verify_integrity=True)) #other:合併鏈接的對象 ignore_index:忽略原來的索引 verify_integrity 驗證索引的錯誤報錯
print(df1.append(other=[df2[:10],df2[10:]],ignore_index=True,verify_integrity=True))   #合併多個數據源 使用列表[ 傳參];
print(df1.append(other=[df2[:10],df2[10:]],ignore_index=True,verify_integrity=True))
import pandas as pd bj08=pd.read_csv(filepath_or_buffer='PM25\Beijing_2008_HourlyPM2.5_created20140325.csv',header=2,usecols=[0,2,3,4,5,6,7,9,10]) bj09=pd.read_csv(filepath_or_buffer='PM25\Beijing_2009_HourlyPM25_created20140709.csv',header=2,usecols=[0,2,3,4,5,6,7,9,10]) bj10=pd.read_csv(filepath_or_buffer='PM25\Beijing_2010_HourlyPM25_created20140709.csv',header=2,usecols=[0,2,3,4,5,6,7,9,10]) bj11=pd.read_csv(filepath_or_buffer='PM25\Beijing_2011_HourlyPM25_created20140709.csv',header=2,usecols=[0,2,3,4,5,6,7,9,10]) bj12=pd.read_csv(filepath_or_buffer='PM25\Beijing_2012_HourlyPM2.5_created20140325.csv',header=2,usecols=[0,2,3,4,5,6,7,9,10]) bj13=pd.read_csv(filepath_or_buffer='PM25\Beijing_2013_HourlyPM2.5_created20140325.csv',header=2,usecols=[0,2,3,4,5,6,7,9,10]) bj14=pd.read_csv(filepath_or_buffer='PM25\Beijing_2014_HourlyPM25_created20150203.csv',header=2,usecols=[0,2,3,4,5,6,7,9,10]) bj15=pd.read_csv(filepath_or_buffer='PM25\Beijing_2015_HourlyPM25_created20160201.csv',header=2,usecols=[0,2,3,4,5,6,7,9,10]) bj16=pd.read_csv(filepath_or_buffer='PM25\Beijing_2016_HourlyPM25_created20170201.csv',header=2,usecols=[0,2,3,4,5,6,7,9,10]) bj=bj08.append(other=[bj09,bj10,bj11,bj12,bj13,bj14,bj15,bj16],ignore_index=True,verify_integrity=True) print(bj.to_html())
append縱向合併北京PM2.5

 

3.1 橫向合併

橫向合併 相似 MySQL中的join連表操做,在Pandas中使用pd.merge、join、concat 方法都可實現,Actually 吾生有崖,學無涯,So I only studied meger method of Pandas, 如下是merge()接受的參數;

left: 拼接的左側DataFrame對象 right: 拼接的右側DataFrame對象 how:left/right/inner(和MySQL的SQL連表規則是同樣同樣的) let: 左側鏈接(顯示左側表所有數據,若是右側表沒有對應的數據,NAN代替) right:右側鏈接(顯示右側表所有數據,若是左側表沒有對應的數據,NAN代替) inner:等值鏈接(公平 只顯示有關聯的數據) left_index=True/False: 使用左側表的索引去鏈接 right_index=True/Fales: 使用右側表的索引去鏈接 sort=True:是否排序 indicator:新增1列 標記數據來源 right_only/left_only/both

 

import numpy,math,re from sqlalchemy import create_engine import matplotlib.pyplot as plt import matplotlib as mpl mpl.rcParams['font.sans-serif'] = ['KaiTi'] mpl.rcParams['font.serif'] = ['KaiTi'] pd.options.display.max_rows=50 #配置最多輸出多少行
df1=pd.read_csv('a.csv',sep='|') df2=pd.read_csv('b.csv',sep='|') df3=pd.read_csv('c.csv',sep='|') df4=df1.append(df2) df5=pd.merge(df3,df4) print(df5)
pd.merge()
import pandas as pd from sqlalchemy import create_engine pd.options.display.max_rows=20 #配置最多輸出多少行
mysql_con=create_engine('mysql+pymysql://webproject:xxxxxx1234@172.17.10.112:3306/web?charset=utf8') df1=pd.read_sql(sql='cmdb_host',con=mysql_con,columns=['hostname','ip_addr','port','idc_id'])[:20] df2=pd.read_sql(sql='cmdb_idc',con=mysql_con,columns=['id','name'])[:20] # print(df1) # print(df2)
print(pd.merge(left=df1,right=df2,how='right',left_on='idc_id',right_on='id',sort=True,indicator='來源標記')) ''' left: 拼接的左側DataFrame對象 right: 拼接的右側DataFrame對象 how:left/right/inner let: 左側鏈接(顯示左側表所有數據,若是右側表沒有對應的數據,NAN代替) right:右側鏈接(顯示右側表所有數據,若是左側表沒有對應的數據,NAN代替) inner:等值鏈接(公平 只顯示有關聯的數據) left_index=True/False: 使用左側表的索引去鏈接 right_index=True/Fales: 使用右側表的索引去鏈接 sort=True:是否排序 indicator:新增1列 標記數據來源 right_only/left_only/both '''
Pandas.merge()模擬數據庫鏈接操做

 

 

 

9、Pandas數據清洗

以上內容介紹了Panda如何讀取數據源、創建索引,如何修改、篩選行和列,如何合併、連表多個數據源,數據準備好了,接下來就是數據清洗工做了。

 

1.設置缺失值 

若是 DataFrame中 某些數據 是不須要參與計算、分析的,咱們能夠把他們設置爲系統缺失值;

在DataFrame中默認有2種缺失值  None/np.nan,使用df.isnan()進行 True/False判斷。

 

1.0.系統缺失True/False判斷、檢查

a.檢查每一個單元格是否爲缺失值?

import pandas as pd import numpy df1=pd.read_csv(filepath_or_buffer='univ.csv',encoding='gbk') print(df1.replace(to_replace=['北京',100],value=numpy.nan).isna())              #檢查每一個單元格是否爲缺失值?
print(df1.replace(to_replace=['北京',100],value=numpy.nan).isna())

b.檢查 指定列 中是否包含缺失值?

import pandas as pd import numpy df1=pd.read_csv(filepath_or_buffer='univ.csv',encoding='gbk') # print(df1.replace(to_replace=['北京',100],value=numpy.nan).isna()) #檢查每一個單元格是否爲缺失值?
print(df1.replace(to_replace=['北京',100],value=numpy.nan).名次.isna())          #檢查指定列是否包含缺失?
print(df1.replace(to_replace=['北京',100],value=numpy.nan).名次.isna())

c.檢查每行是否包含缺失值?

import pandas as pd import numpy df1=pd.read_csv(filepath_or_buffer='univ.csv',encoding='gbk') # print(df1.replace(to_replace=['北京',100],value=numpy.nan).isna()) #檢查每一個單元格是否爲缺失值? # print(df1.replace(to_replace=['北京',100],value=numpy.nan).名次.isna()) #檢查指定列是否包含缺失?
print(df1.replace(to_replace=['北京',100],value=numpy.nan).isna().any(1))       #檢查每行是否包含缺失值?
print(df1.replace(to_replace=['北京',100],value=numpy.nan).isna().any(1))

d.把包含缺失值的行 顯示出來

import pandas as pd import numpy df1=pd.read_csv(filepath_or_buffer='univ.csv',encoding='gbk') # print(df1.replace(to_replace=['北京',100],value=numpy.nan).isna()) #檢查每一個單元格是否爲缺失值? # print(df1.replace(to_replace=['北京',100],value=numpy.nan).名次.isna()) #檢查指定列是否包含缺失? # print(df1.replace(to_replace=['北京',100],value=numpy.nan).isna().any(1)) #檢查每行是否包含缺失值?
print(df1[df1.replace(to_replace=['北京',100],value=numpy.nan).isna().any(1)])   #把包含缺失值的行 顯示出來
print(df1[df1.replace(to_replace=['北京',100],value=numpy.nan).isna().any(1)])

 

 

1.1.缺失值設置爲None/numpy.nan的區別

import pandas as pd import numpy df1=pd.read_csv(filepath_or_buffer='univ.csv',encoding='gbk') print(None==None)             #True
print(numpy.nan == numpy.nan)  #False 不能夠和自身進行比較
None能夠和自身比較,np.nan不能夠;
import pandas as pd import numpy df1=pd.read_csv(filepath_or_buffer='univ.csv',encoding='gbk') df2=df1.replace(to_replace=['北京'],value=[numpy.nan]) #會把全部的 "北京" 徹底替換成 NaN
print(df1.所在省份.replace(to_replace=['北京'],value=None))#若是把缺失值設置爲None時,使用左右、原來其餘值代替;
''' 0 北京 1 北京 2 上海 3 湖北 '''
把缺失值設置爲None時,缺失值不會變成None

 

PS.把缺失值設置爲Nan

 

2.處理缺失值

對於缺失值的處理方法無非2種,替換或者刪除,;

 

2.0.替換成指定數字、字符串fillna()

import pandas as pd import numpy df1=pd.read_csv(filepath_or_buffer='univ.csv',encoding='gbk') # print(df1.replace(to_replace=['北京',100],value=numpy.nan).isna()) #檢查每一個單元格是否爲缺失值? # print(df1.replace(to_replace=['北京',100],value=numpy.nan).名次.isna()) #檢查指定列是否包含缺失? # print(df1.replace(to_replace=['北京',100],value=numpy.nan).isna().any(1)) #檢查每行是否包含缺失值? # print(df1[df1.replace(to_replace=['北京',100],value=numpy.nan).isna().any(1)]) #把包含缺失值的行 顯示出來
 df2=df1.replace(to_replace=['北京',100],value=numpy.nan).fillna('未知')             #把缺失值替換成 指定字符串
df3=df1.replace(to_replace=['北京',100,1,2,3],value=numpy.nan).fillna(df1.mean())    #把缺失值替換成 中位數(若是當前列的數據類型爲數字 不然仍然是nan)
.fillna('未知')

根據鄰近得值進行填充

new_part_pd=pd.concat([part_df,public_attr,],axis=0,sort=True,join='outer').fillna(method='pad',axis=0)##按照列(橫向填充)NaN上1和
method: 根據什麼規則進行填充? pad/ffill:用前一個非缺失值去填充該缺失值,用左邊的非缺失值去填充該缺失值 backfill/bfill:用下一個非缺失值填充該缺失值,用右邊的非缺失值去填充該缺失值 None:指定一個值去替換缺失值(默認這種方式) limit參數:限制填充個數 axis參數:修改填充方向,默認爲縱向填充,axis=1的時候,橫向填充

 

 

2.1.刪除缺失值 dropna()

''' axis:0 0表明行 1表明列 how: any任何1個單元格出現NAN就刪除,all 全部單元格都出現 NAN才刪除 thresh: 設置刪除行或者列的數量 subset:指定刪除的行/列 '''
import pandas as pd import numpy df1=pd.read_csv(filepath_or_buffer='univ.csv',encoding='gbk') # print(df1.replace(to_replace=['北京',100],value=numpy.nan).isna()) #檢查每一個單元格是否爲缺失值? # print(df1.replace(to_replace=['北京',100],value=numpy.nan).名次.isna()) #檢查指定列是否包含缺失? # print(df1.replace(to_replace=['北京',100],value=numpy.nan).isna().any(1)) #檢查每行是否包含缺失值? # print(df1[df1.replace(to_replace=['北京',100],value=numpy.nan).isna().any(1)]) #把包含缺失值的行 顯示出來


# df2=df1.replace(to_replace=['北京',100],value=numpy.nan).fillna('未知') #把缺失值替換成 指定字符串 # df3=df1.replace(to_replace=['北京',100,1,2,3],value=numpy.nan).fillna(df1.mean()) #把缺失值替換成 中位數(若是當前列的數據類型爲數字 不然仍然是nan)
 df4=df1.replace(to_replace=['北京',100],value=numpy.nan).dropna(axis=0,how='any',thresh=3,subset=['總分','所在省份','名次']) ''' axis:0 0表明行 1表明列 how: any任何1個單元格出現NAN就刪除,all 全部單元格都出現 NAN才刪除 thresh: 設置刪除行或者列的數量 subset:指定刪除的行/列 '''
print(df4)
dropna(axis=0,how='any',thresh=3,subset=['總分','所在省份','名次'])

 

 

3.數據查重  .duplicated()和重複行刪除.drop_duplicates()

3.0. 新增 dup 列 標識出 重複行

PS.只有 第二次出現的纔會被標識出來

import pandas as pd import numpy df1=pd.read_csv(filepath_or_buffer='univ.csv',encoding='gbk') df1['dup']=df1.duplicated(['類型','所在省份']) #標識出 '類型','所在省份'兩列重複的行
print(df1)
df1['dup']=df1.duplicated(['類型','所在省份']) #標識出 '類型','所在省份'兩列重複的行

 

3.1.檢查索引是否重複並標識出來 index.duplicated()

import pandas as pd import numpy df1=pd.read_csv(filepath_or_buffer='univ.csv',encoding='gbk') # df1['dup']=df1.duplicated(['類型','所在省份']) #標識出 '類型','所在省份'兩列重複的行 # print(df1)
 df1['dup']=df1.set_index(['類型','所在省份']).index.duplicated() print(df1)
df1['dup']=df1.set_index(['類型','所在省份']).index.duplicated()
print(sa_df.duplicated(subset=['SAevent_en','SAevent_cn', 'SAproperty_en', 'SAproperty_cn', 'SAproperty_data_type']).any())

 

 3.2.刪除出現重複的行  df1.drop_duplicates()

subset:設置重複的列或者索引列 keep:重複以後刪除規則(first/last/False,first保留第1個,last保留最後1個,False所有刪除)
import pandas as pd import numpy df1=pd.read_csv(filepath_or_buffer='univ.csv',encoding='gbk') #  # df1['dup']=df1.duplicated(['類型','所在省份']) #標識出 '類型','所在省份'兩列重複的行 # print(df1) #  # df1['dup']=df1.set_index(['類型','所在省份']).index.duplicated()

print(df1.drop_duplicates(subset=['類型','所在省份'],keep=False)) ''' subset:設置重複的列或者索引列 keep:重複以後刪除規則(first/last/False,first保留第1個,last保留最後1個,False所有刪除) '''

print(df1[~df1.duplicated(subset=['類型','所在省份'],keep=False)]) #簡潔語法
print(df1[~df1.duplicated(subset=['類型','所在省份'],keep=False)])

 

3.3 df.empty 判斷一個dataframe非空

if df_design.empty: logs.append('事件設計錯誤,請再檢查一下事件設計!') return render(request, 'update_cname.html', {"logs": logs, "is_update": True})

 

10、處理 日期、時間數據

不少數據分析都是以時間軸爲基礎進行的,Maybe 小時的訂單量、天天的訂單量whatever....

因此咱們須要把DataFreme中時間轉換成Pandas理解的時間,而後創建時間索引,進行靈活、切邊 再進行彙總分析;

 

Pandas中有4種時間類型

Timestamp:   表示具體的日期時間(精確到秒) DatetimeIndex:  基於Timestamp創建日期時間索引 Period:    Timestamp表示精確時間而Period能夠表示1段時間 Forexample (2019年6月這1月 、2019年6月1號 這1天) PeriodIndex:   若是基於Period時間段創建索引就是PeriodIndex

 

1.建立Timestamp和Period日期時間類型

import pandas as pd from datetime import datetime print(pd.Timestamp(datetime(1993,6,25))) #datetime become Timestamp
print(pd.Period('1993-05',freq='D'))
建立Timestamp和Period

 

2.將已有數據轉成Timestamp時間類型(pd.to_datetime)

既然使用Pandas作數據分析,就得把您的日期時間數據轉換成Pandas理解的時間類型

import pandas as pd from datetime import datetime bj08=pd.read_csv(filepath_or_buffer='PM25\Beijing_2008_HourlyPM2.5_created20140325.csv',header=2,usecols=[0,2,3,4,5,6,7,9,10]) print(pd.Timestamp(bj08['Date (LST)'][0])) #轉換單個字符串
print(bj08['Date (LST)'].apply(pd.Timestamp)) #轉成整行

#以上的日期時間轉換方式若是不盡如你意,可使用to_datatime()
print(pd.to_datetime(datetime(1993,6,30,8,26))) #轉換單個datetime日期
print(pd.to_datetime("1993-6-30 8:26")) #轉換單個字符串日期
print(pd.to_datetime(['1993/6/30','1993.6.30'])) #轉換列表日期
print(pd.to_datetime(bj08['Date (LST)'],format='%Y-%m-%d %H:%M')) #批量轉換
print(pd.to_datetime(bj08[['Year','Month','Day','Hour']])) #將多列合併轉換成 Timestamp時間類型
pd.to_datetime()

 

3.DatatimeIndex索引時間類型

把日期時間數據轉成Timestamp時間類型後,面臨如下幾個問題;

如何根據時間的層級提取數據 ?(年/月/日/....)

如何快速提取指定時間的數據?

如何按照時間範圍提取數據?(提取8-9月的訂單)

因此最後須要創建DatatimeIndex時間索引;

import pandas as pd from datetime import datetime bj08=pd.read_csv(filepath_or_buffer='PM25\Beijing_2008_HourlyPM2.5_created20140325.csv',header=2,usecols=[0,2,3,4,5,6,7,9,10]) # print(pd.date_range('1/1/2012',periods=5,freq='M')) #生成 2012 1-5月的數據 5條記錄
 bj08idx=bj08.set_index(pd.to_datetime(bj08['Date (LST)'])) #轉成Datetimestamp時間類型,而後創建DatetimeIndex時間索引 # print(type(bj08idx.index)) #<class 'pandas.core.indexes.datetimes.DatetimeIndex'>

print(bj08idx['2008-11-1':'2008-11-5 9:00']) #基於DatetimeInde時間索引 切片 # print(bj08idx['2008-11-1']) #基於DatetimeIndex時間索引 獲取某天的數據x
代碼

 

4.基於DatatimeIndex時間索引進行分組彙總

能夠根據日期時間,靈活切割數據以後,就是對數據的分組、彙總、分析了;

resample()有不少參數,參考官網;

import pandas as pd from datetime import datetime bj08=pd.read_csv(filepath_or_buffer='PM25\Beijing_2008_HourlyPM2.5_created20140325.csv',header=2,usecols=[0,2,3,4,5,6,7,9,10]) bj08idx=bj08.set_index(pd.to_datetime(bj08['Date (LST)'])) #轉成Datetimestamp時間類型,而後創建DatetimeIndex時間索引

# every_hour_data=bj08idx.index.hour #獲取每一個小時的數據 # print(bj08idx.groupby(every_hour_data).max()) #獲取每一個小時PM2.5的最大值


print(bj08idx.resample('3D').mean()) #按3天進行分組,而後求平均值
''' 2008-04-08 15:00:00 2008.0 4.000000 9.625000 11.500000 87.361111 2008-04-11 15:00:00 2008.0 4.000000 12.625000 11.500000 78.236111 2008-04-14 15:00:00 2008.0 4.000000 15.625000 11.500000 186.083333 2008-04-17 15:00:00 2008.0 4.000000 18.625000 11.500000 131.555556 '''
print(bj08idx.resample('3D').mean()) #按3天進行分組,而後求平均值

 

5.對時間索引缺失值的處理

若是時間索引列  的時間數據是固定時間頻率,某個時間值缺失也是能夠填充的;

2009-02-01 00:00:00  Beijing  2009-02-17 17:00  2009.0    2.0  17.0  17.0   
2009-02-01 01:00:00  Beijing  2009-02-17 17:00  2009.0    2.0  17.0  17.0   
2009-02-01 NAN       Beijing  2009-02-17 17:00  2009.0    2.0  17.0  17.0   
2009-02-01 03:00:00  Beijing  2009-02-17 17:00  2009.0    2.0  17.0  17.0

步驟以下

一、篩選出 value值大於0的索引(篩選出有效數據)
二、利用date_range生成嶄新的完整索引
3.刪除缺失值 從新創建索引
import pandas as pd from datetime import datetime bj09=pd.read_csv(filepath_or_buffer='PM25\Beijing_2009_HourlyPM25_created20140709.csv',header=2,usecols=[0,2,3,4,5,6,7,9,10]) bj09idx=bj09.set_index(pd.to_datetime(bj09['Date (LST)'])) #一、篩選出 value值大於0的索引(篩選出有效數據)
bj09idx=bj09idx[bj09idx.Value > 0] # print(bj09idx) #二、利用date_range生成嶄新的完整索引
idx=pd.date_range(start='2009-02-1 00:00:00',end='2009-12-31 23:00:00',freq='H') # bj09idx.reindex(idx) #把新的索引給 bj09idx 創建新索引

#print(bj09idx[bj09idx.index.duplicated()]) #顯示重複的索引,發現2個2009-03-08 03:00:00 索引 # 2009-03-08 03:00:00 1 Hr Valid #2009-03-08 03:00:00 1 Hr Valid # print(bj09idx['2009-03-08']) #

#3.刪除缺失值 從新創建索引
bj10idx10=bj09idx[~bj09idx.index.duplicated()].reindex(idx,method='bfill') #print(bj10idx10.shift(3)) #序列數值平移
代碼

 

 

11、基於Pandas對數據繪圖

import numpy,math,re from sqlalchemy import create_engine import matplotlib.pyplot as plt import matplotlib as mpl import pandas as pd mpl.rcParams['font.sans-serif'] = ['KaiTi'] mpl.rcParams['font.serif'] = ['KaiTi'] pd.options.display.max_rows=10 #配置最多輸出多少行
mysql_con=create_engine('mysql+pymysql://webproject:xxxxxx1234@172.17.10.112:3306/web') oracle_conn=create_engine('oracle+cx_oracle://scott:tiger@172.16.22.16:1521/ecdb') data=pd.read_sql(sql='cmdb_worker_order',con=mysql_con,index_col='seach',columns=['agent','fault_category']).query('fault_category in [0,1,2,3]',inplace=False) pd.value_counts(data.agent).plot.barh() plt.title('運維平臺用戶2018年工單建立量') plt.xlabel('數量') plt.ylabel('用戶') plt.savefig('1.png')#保存圖片(把圖片保存在服務器,就能夠經過前端 src啦!)
plt.show()
統計運維平臺用戶工單建立量

 

from sqlalchemy import create_engine import matplotlib.pyplot as plt import matplotlib as mpl import pandas as pd mpl.rcParams['font.sans-serif'] = ['KaiTi'] mpl.rcParams['font.serif'] = ['KaiTi'] pd.options.display.max_rows=10 #配置最多輸出多少行
mysql_con=create_engine('mysql+pymysql://webproject:xxxxxx1234@172.17.10.112:3306/web') oracle_conn=create_engine('oracle+cx_oracle://scott:tiger@172.16.22.16:1521/ecdb') data=pd.read_sql(sql='cmdb_worker_order',con=mysql_con,index_col='seach',columns=['agent','fault_category']).query('fault_category in [0,1,2,3]',inplace=False) df=pd.value_counts(data.agent) fig = plt.figure()                              #在任何繪圖以前,咱們須要一個Figure對象,能夠理解成咱們須要一張畫板才能開始繪圖。
ax = fig.add_subplot(111)                       #添加每個 Axes能夠理解成爲真正能夠做畫的紙。
 ax.set_xlabel('員工姓名')                    #plt.gcf() #獲取當前Figure/plt.gca()#獲取當前Axes
ax.set_ylabel('工單處理數量') ax.set_title('2018年員工工單處理數量') for a,b in zip(df.index,df.values):          #plt.text(第一個參數是x軸座標,第二個參數是y軸座標,第三個參數是要顯式具體數字 )
    plt.text(a,b,b, ha='center', va='bottom', fontsize=19) ax.bar(df.index,df.values) #畫bar條圖
plt.show()
bar水平條圖

 

數據讀入-->創建索引---->清洗完畢了------>千辛萬苦得把數據整理完了,下面就是經過 matplotlib模塊繪圖,來了解一下數據的概況了;

 

1.調整刻度大小

 

2.df1.plot參數

df1.plot(x=df1.index, title='工單月建立量',kind='line',figsize=(25,15))
'''
x:x軸變量名稱
y:y軸的變量名稱
kind:指定要繪製的圖形種類
line 線圖
bar 垂直的條圖
barh 水平的條圖
hist 方圖
density 密度圖
box 箱圖
area面積圖
pie 餅圖

label:對圖的描述
figsize:指定圖形的寬、高

xlim/ylim:X軸Y軸的取值範圍
'''
from sqlalchemy import create_engine import pandas as pd import matplotlib.pyplot as plt #導入python繪圖模塊
import seaborn import matplotlib.dates as mdate plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['font.serif'] = ['KaiTi'] seaborn.set_style('whitegrid',{'font.sans-serif':['simhei','Arial']}) #seaborn模塊美化繪圖的模塊 加上白色空格
 mysql_con=create_engine('mysql+pymysql://webproject:xxxxxx1234@172.17.10.112:3306/web') data=pd.read_sql(sql='cmdb_worker_order',con=mysql_con,columns=['alarm_time','agent','fault_category']).query('fault_category not in [0,1,2,3]',inplace=False) df1=data.set_index(pd.to_datetime(data['alarm_time'],format='%Y.%m.%d_%H:%M:%S')).resample('M').agent.count() df1.plot(x=df1.index, title='工單月建立量',kind='line',figsize=(25,15)) plt.tick_params(axis="both",which="major",labelsize=8) plt.show() #plt.savefig('1.png')#保存圖片(把圖片保存在服務器,就能夠經過前端 src啦!)






''' x:x軸變量名稱 y:y軸的變量名稱 kind:指定要繪製的圖形種類 line 線圖 bar 垂直的條圖 barh 水平的條圖 hist 方圖 density 密度圖 box 箱圖 area面積圖 pie 餅圖 label:對圖的描述 figsize:指定圖形的寬、高 xlim/ylim:X軸Y軸的取值範圍 '''
代碼

 

 

3.設置matplotlib x軸的時間刻度、顯示格式 參考

import numpy,math,re from sqlalchemy import create_engine import pandas as pd import matplotlib.pyplot as plt #導入python繪圖模塊
import seaborn import matplotlib.dates as mdate from matplotlib.dates import DateFormatter,datestr2num,DateFormatter # plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['font.serif'] = ['KaiTi'] seaborn.set_style('whitegrid',{'font.sans-serif':['simhei','Arial']}) #seaborn模塊美化繪圖的模塊 加上白色空格
 mysql_con=create_engine('mysql+pymysql://webproject:xxxxxx1234@172.17.10.112:3306/web') data=pd.read_sql(sql='cmdb_worker_order',con=mysql_con,columns=['alarm_time','agent','fault_category']).query('fault_category not in [0,1,2,3]',inplace=False) df1=data.set_index(pd.to_datetime(data['alarm_time'],format='%Y.%m.%d_%H:%M:%S')). resample('M').count() fig = plt.figure()                              #在任何繪圖以前,咱們須要一個Figure對象,能夠理解成咱們須要一張畫板才能開始繪圖。
ax = fig.add_subplot(111)                       #添加每個 Axes能夠理解成爲真正能夠做畫的紙。
 formatter = DateFormatter('%m')                 #設置時間顯示格式 爲/月
ax.xaxis.set_major_locator(mdate.MonthLocator()) ax.xaxis.set_major_formatter(formatter) ax.set_xlabel('時間(月份)')                    #plt.gcf() #獲取當前Figure/plt.gca()#獲取當前Axes
ax.set_ylabel('數量') ax.set_title('2018年工單建立狀況') ax.plot(df1.index,df1['fault_category'],color='r') plt.show() # plt.savefig('3.png') #保存圖片
代碼

 

 

4.plt.text()在圖形中添加純文本註釋,顯示具體數值。

plt.text(第一個參數是x軸座標,第二個參數是y軸座標,第三個參數是要顯式具體數字 )

for a,b in zip(df.index,df.values): plt.text(a, b,b, ha='center', va='bottom', fontsize=9)
plt.text(a, b,b, ha='center', va='bottom', fontsize=9)

 

 

5.pie餅圖

from sqlalchemy import create_engine import matplotlib.pyplot as plt import matplotlib as mpl import pandas as pd mpl.rcParams['font.sans-serif'] = ['KaiTi'] mpl.rcParams['font.serif'] = ['KaiTi'] pd.options.display.max_rows=10 #配置最多輸出多少行
mysql_con=create_engine('mysql+pymysql://webproject:xxxxxx1234@172.17.10.112:3306/web') oracle_conn=create_engine('oracle+cx_oracle://scott:tiger@172.16.22.16:1521/ecdb') data=pd.read_sql(sql='cmdb_worker_order',con=mysql_con,columns=['initiator','fault_category','is_late','agent']).query('fault_category in [0,1,2,3,4] and is_late == True',inplace=False) df=pd.value_counts(data.agent) fig = plt.figure()                              #在任何繪圖以前,咱們須要一個Figure對象,能夠理解成咱們須要一張畫板才能開始繪圖。
ax = fig.add_subplot(111)                       #添加每個 Axes能夠理解成爲真正能夠做畫的紙。
ax.set_title('當前超時工單信息') print(dict(zip(df.index,df))) lables=[ i+' 數量:'+str(v)  for i,v in dict(zip(df.index,df)).items() ] ax.pie(df,labels=lables,shadow = False,autopct ='%3.1f%%') plt.axis('equal') plt.savefig('late_work_order.png')  #保存爲圖片
餅圖

 

以上是我對pandas0.20.0版本的使用,如下是我對pandas0.25.1版本的使用

行操做

獲取df中的第X行數據

xls = pd.ExcelFile('pandas.xlsx') df = xls.parse(header=None) print(df.iloc[3]) ''' 0 小王 1 12 2 女 Name: 3, dtype: object '''
#若是是僅有1列的df可以使用函數
df.columns=['name','age','gender']
df1=df.groupby(by='name').size().loc[lambda x: x == 1]
print(df['name'].loc[lambda x:x=='小麗'])

 

 

獲取df的每1行數據以及索引

xls = pd.ExcelFile('pandas.xlsx') df = xls.parse( header=None) for index, item in df.iterrows(): print(item) ''' 0 姓名 1 年齡 2 性別 Name: 0, dtype: object 0 張根 1 18 2 男 Name: 1, dtype: object '''

 

 精確獲取第X行中的第X個數據

xls = pd.ExcelFile('pandas.xlsx') df = xls.parse(header=None) print(df.iloc[4,0])#位於第4行中的第0個元素

 

 

拆分1個大的單元格

for index, item in df.iterrows(): if index == 0: item[1] = '公共屬性' item[2] = '公共屬性'
        elif not pd.isnull(item[1]): pass
        else: item[1] = df.iloc[index - 1, 1].replace('\n','') item[2] = df.iloc[index - 1, 2] item[7] = df.iloc[index - 1, 7] item[8] = df.iloc[index - 1, 8]

 

使用df.iloc[:,:3]獲取X列數據

print(df.iloc[:,:3]) #獲取3列數據

 

 獲取1-最後1行數據(掐頭)

df1[1:]

 

刪除重複行

print(df1.iloc[:,0:5].drop_duplicates())#去除相同的行

 

行查詢

df.columns=['os','app_version','event','item_type','e_item_id','i_item_id','i_item_type'] df_group=df.groupby(['os','app_version','event']) successful_df_list=[] unsuccessful_df_list=[] for title,item in df_group: successful_df=item.loc[(item['i_item_id'] !=numpy.NaN) & (item['item_type'] ==item['i_item_type'])] unsuccessful_df=item.loc[~((item['i_item_id'] !=numpy.NaN) & (item['item_type'] ==item['i_item_type']))]

 

 

合併操做

merge(left_on='gender', right_on='gender1')

左邊和右邊的df中相同的部分去掉,不一樣的部分顯示出來;(求2者差集)

xls = pd.ExcelFile('pandas.xlsx') df1 = xls.parse( header=None) df1.columns=['name','age','gender'] xls = pd.ExcelFile('pandas1.xlsx') df2 = xls.parse( header=None) df2.columns=['name1','age1','gender1'] df3=df1.merge(df2, left_on='gender', right_on='gender1')#左邊表裏的和右表裏面的列是同樣的我就合併
print(df3)

 

 

 

 

 

Matplotlib詳解圖像各個部分

Matplotlib基本用法

Pandas官網

相關文章
相關標籤/搜索