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去掉表頭
