pandas之數據存儲


pandas對象修改試圖模式和副本模式
視圖模式:多個變量指向同一個內存

  1. 修改一個變量另外一個變量也會改變
  2. 操作如:將一個對象整體賦值給另外一個變量

副本模式

  1. 修改一個變量,另外一個變量不會變
  2. 操作如:將一個對象查詢的一部分賦值給另外一個變量

當一個對象整體賦值給另一個變量時,視圖模式,2個變量對應的內存地址相同,修改一個變量,另外一個變量也會改變
當使用copy將一個變量賦值給另外一個變量

  1. 或者使用查詢賦值,查詢數據的一部分並賦值給其他 變量
  2. 當賦值為原數查詢一部分時,是副本模式,修改一個變量不會影響另外一個變量
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去掉表頭

  

  

 

 

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM