pandas對象修改試圖模式和副本模式
視圖模式:多個變量指向同一個內存
- 修改一個變量另外一個變量也會改變
- 操作如:將一個對象整體賦值給另外一個變量
副本模式
- 修改一個變量,另外一個變量不會變
- 操作如:將一個對象查詢的一部分賦值給另外一個變量
當一個對象整體賦值給另一個變量時,視圖模式,2個變量對應的內存地址相同,修改一個變量,另外一個變量也會改變
當使用copy將一個變量賦值給另外一個變量
- 或者使用查詢賦值,查詢數據的一部分並賦值給其他 變量
- 當賦值為原數查詢一部分時,是副本模式,修改一個變量不會影響另外一個變量
a_values = [ [ "張秀英", 0, 82,171, 66,"阜新市",73], ["毛桂英", 1, 18, 173, 56,"金華市",70], [ "邵濤", 1,15, 163, 58, "濱州市",88], ["傅麗",1, 68,185,50,"秦皇島市",81], ["宋秀蘭",0,86,182, 79,"烏海市",68] ] a = pd.DataFrame(a_values,index=[1,2,3,4,5],columns=['name','sex','age','heigh','weight','address','grade']) #視圖模式 修改單元格內的值,a賦值給b時候,a,b同時指向一個地址,節省內存 b = a b.loc[1, 'name'] = 'bobby' # id(a) == id(b) # 副本模式,方法分為2種 #使用copy賦值;最好使用copy副本模式賦值 c = a.copy() c.loc[1,'name'] = 'caruso' #查詢數據的一部分賦值 d = a[['name','sex','address']] # d = a[['name','sex','address']].copy() 優先使用這種方式 d.loc[1, 'name'] = 'drose'
鏈式調用:盡量避免鏈式調用方式修改,容易出錯
整體調用一次執行
a.loc[0,'name']
鏈式調用分開執行,影響效率;更改數據時候,輕度報警高,重度就是不成功
a['name'][0]
a.loc[0]['name']
pandas數據存儲,數據的輸入輸出是基本操作
pandas可以存取多種介質類型數據
文本類數據
- csv
- json
二進制數據 (電腦上所有的數據都是2進制數據,高級顯示利用編碼顯示)
- excel
- pkl
- hdf5
數據庫
- sql
web api數據
- html
其他
- 內存
文本類數據文件讀入pandas是會自動推斷每列數據類型並轉化
二進制類數據文件會在格式種存儲數據類型
對pandas不能支持活不方便使用的數據格式,可以使用支持軟件將其轉化為csv或xlsx個時候使用pandas讀寫,如spss文件
csv comma-separated values逗號分隔以純文本存儲表數據的一種格式
二維表格數據結構,精簡省空間,用於數據分析
json是多維數據格式,浪費空間,用於傳輸數據api
- name,age,address,grade
- liu,19,beijing,60
- liu,19,'beijing,chaoyang',60
寫入csv
- 默認utf-8模式
- 保存其他格式可以自行設置參數encoding
- 注意:execl打開utf-8的csv文件,中文會亂碼,建議保存gbk
讀取csv
- 注意文本文件編碼格式
- utf-8默認支持
- 其他編碼,需要手動設置參數encoding
- 注意utf-8格式的csv文件,excel讀取時中文會亂碼
pd.read_csv('test.csv', encoding='gb2312', sep=',', #指定分隔符,csv默認是逗號,如果是table表格數據一般為\t #列索引 # header=0, #默認將第一行設置為表頭,其他行也可以 # header=None, # 不將第一行設為索引,列索引 # header=[0,1,2], #層次化索引 # names=['姓名','性別','年齡','身高','體重','地址','成績'], #配合header=0,自定義索引 #行索引 # index_col=None, #行索引,默認值none,不使用數據列,而是使用系統自帶索引 # index_col=0, #把第0行作為列索引 # index_col='name', #name作為列索引 # index_col=[0,1,2], #默認索引,多列層次化索引 # index_col=['name','age'], #自定義索引多列 #讀取行列 # usecols=[0,2,4], # 讀取指定列,默認索引 # usecols=['name','address'], #讀取指定列,自定義索引 # nrows=3, #讀取前幾行 # skiprows=3, #從表格開始算起忽略的行 # skiprows=[2,4], #跳過2,4行 # skipfooter=2, #從表格末尾忽略的行,必須配合engine=‘python’否則會報警 # engine='python', #引擎c更快,python更完善 # 替換空間 # na_values=["烏海市"], # 將csv種某些字符替換成空值nan # keep_default_na=True, # 默認True,同時使用系統自帶的空值替換和自定義空值,如na,n/a False只使用自定義空值 # encoding='utf-8', #默認utf-8, 引擎是python時候需要手動設置 )
a_values = [ [ "張秀英", 0, 82,171, 66,"阜新市",73], ["毛桂英", 1, 18, 173, 56,"金華市",70], [ "邵濤", 1,15, 163, 58, "濱州市",88], ["傅麗",1, 68,185,50,"秦皇島市",81], ["宋秀蘭",0,86,182, 79,"烏海市",68] ] a = pd.DataFrame(a_values,index=[1,2,3,4,5],columns=['name','sex','age','heigh','weight','address','grade']) # 寫入 a.to_csv('test1.csv',encoding='gbk') a.to_csv('test2.csv',encoding='gbk',index=False) # 不保存行索引 header=False 不保存列索引不推薦 a.to_csv('test1.csv',encoding='gbk',columns=['name','age','grade']) # 保存指定的列
parse_dates =[‘index_name’] # 指定某列位時間序列格式
層次化索引查詢
df = pd.read_csv('test.csv',header=[0,1,2],encoding='gbk') df['name']['張秀英']['毛桂英'][0] df = pd.read_csv('test.csv',index_col=[0,1,2],encoding='gbk') df.loc[['張秀英']].loc['張秀英'].loc[0].loc[82]['address']
合並時間列及自定義某列為行索引,多用於時間序列,金融數據分析
參數 parse_dates
- 嘗試將數據解析為日期
- 可以使用列表指定需要解析的一組列名,如果列表元素為字典包含的列表或者元組,會將多個列組合到一起在解析日期解析(日期和時間在2個列情況)
參數 keep_date_col
- 如果連接多列解析日期,保存參與連接的列,默認False
數據
data,time,time2,name,age
20100101, 000000, 00:00:00, '張三', 18
20100101, 230000, 23:00:00, '李三', 28
# 時間序列 t = pd.read_csv('test3.csv',parse_dates=['date','time','time2']) t = pd.read_csv('test3.csv',parse_dates={'s':['date','time2']},keep_date_col=True) t = pd.read_csv('test3.csv',parse_dates={'s':['date','time2']},keep_date_col=True,index_col='s')
pandas讀取excel .xsls
df = pd.DataFrame(np.random.randn(1000,4),columns=['a','b','c','d']) df.to_excel('test.xlsx') # 默認存儲到sheet1 df.to_excel('test.xlsx',sheet_name='abc') # 存儲到abc # 將多個變量寫入同一個excel表格中 # 創建表格 writer = pd.ExcelWriter('output.xlsx') # 插入一個表格 a.to_excel(writer,'abc') df.to_excel(writer,'sheet1',index=None,header=None) # 寫入 writer.save() # 讀取 pd.read_excel('output.xlsx','sheet1').head() #讀取指定的單元表 pd.read_excel('output.xlsx',None) #讀取所有的單元表,返回字典
json : javascript object notation 是通過http請求在web瀏覽器和其他應用程序之間發送數據的標准格式之一
json和csv比較
json是多維數據,csv是2維數據
json數據比較冗余,體積大,csv精簡,體積小
json多用於web數據交互,csv多用於數據領域不同環境切換的數據交互
如果json數據格式超過2維,轉為dataFrame后,只能將0/1轉為表格,其他維度會議python字典格式存入單元格
a.to_json('test.json') pd.read_json('test.json')
使用hdf5格式
科學領域大數據存儲的同行標准,如天文地理
frame = pd.DataFrame({'a':np.random.randn(100)}) # 存儲,默認fixed, format='table'文件大了很多 frame.to_hdf('test.hdf5','obj1') # 讀取 x = pd.read_hdf('test.hdf5') #文件只存儲一個變量,如果有多個變量讀取出錯 x = pd.read_hdf('test.hdf5','obj1') #指定變量命輸出 frame.to_hdf('test1.hdf5','obj1',format='table') pd.read_hdf('test1.hdf5','obj1',where=['index<5 and index>1'])
# 創建或讀取hdf5文件沒有就創建,有就讀取 store = pd.HDFStore('test3.h5') store['obj1'] = frame # put是直接賦值顯示版本,可以自定義格式化格式 store.put('obj2',frame,format='table')
xml&html 網頁收集
table = pd.read_html('http://www.stats.gov.cn/tjsj/zxfb/201806/t20180630_1607071.html') #某些網絡下無法抓取 # 復制后直接從內存讀取 # https://cn.investing.com/currencies/usd-cny-historical-data pd.read_clipboard(engine='python',header=None) # header去掉表頭