程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Pandas數據分析02——各類文件的讀取和導出

編輯:Python

 參考書目:《深入淺出Pandas:利用Python進行數據處理與分析》


pandas真的很強大,幾乎什麼格式的數據 都能讀取,什麼csv,excel,spss,stata,json,html......連剪貼板的數據都能讀.....本章教大家怎麼讀取數據,雖然簡單讀取就一句話,但是參數和功能還是很多的,都了解一下。


讀取CSV文件

csv文件最基礎的數據文件,介紹的最詳細,因為別的文件的很多參數和csv讀取方法都差不多

import pandas as pd
import numpy as np
# 文件目錄
pd.read_csv('data.csv') # 如果文件與代碼文件在同目錄下
pd.read_csv('D:\AAA最近要用\深度學習\自己的項目\風力發電\少一點.csv') # 指定目錄
pd.read_csv('data\my\my.data') # CSV 文件擴展名不一定是 csv
# 使用網址 url
pd.read_csv('https://www.gairuo.com/file/data/dataset/GDP-China.csv')

 字符串中讀取

# 也可以從 StringIO 中讀取
from io import StringIO
data = ('col1,col2,col3\n'
'a,b,1\n'
'a,b,2\n'
'c,d,3')
pd.read_csv(StringIO(data)).to_csv('data.data',index=False) #存一下

 分隔符

# 數據分隔轉化是逗號, 如果是其他可以指定
pd.read_csv('data.data', sep='\t') # 制表符分隔 tab
pd.read_table('data.data') # read_table 默認是制表符分隔 tab
pd.read_csv('data.data', sep='|') # 制表符分隔 tab

 指定列名和表頭

#指定列名和表頭
pd.read_csv(data, header=0) #默認第一行
pd.read_csv(data, header=None) # 沒有表頭
pd.read_csv(data, names=['列1', '列2']) # 指定列名列表
pd.read_csv(data, names=['列1', '列2'],header=None) # 指定列名列表
# 如沒列名,自動指定一個: 前綴加序數
pd.read_csv(data, prefix='c_', header=None) #表頭為c_0,c_1...

指定索引

#指定索引
pd.read_csv(data,index_col=False) #不使用首列作為索引
pd.read_csv(data,index_col=0) #第幾列為索引
pd.read_csv(data,index_col='年份')#指定列名
pd.read_csv(data,index_col=['a','b']) #多個索引
pd.read_csv(data,index_col=[0,3]) #多索引

讀取部分列

# 讀取部分列
pd.read_csv(data, usecols=[0,4,3]) # 按索引只讀取指定列,順序無關
pd.read_csv(data, usecols=['列1', '列5']) # 按索引只讀取指定列
# 指定列順序,其實是 df 的篩選功能
pd.read_csv(data, usecols=['列1', '列5'])[['列5', '列1']]
pd.read_csv(data, index_col=0) # 第幾列是索引
# 以下用 callable 方式可以巧妙指定順序, in 後邊的是我們要的順序
pd.read_csv(data, usecols=lambda x: x.upper() in ['COL3', 'COL1'])

 處理重復列名

#處理重復列名
data='a,b,a\n0,1,2\n5,6,4'
pd.read_csv(StringIO(data),mangle_dupe_cols=True)

數據類型 

#數據類型
data = 'https://www.gairuo.com/file/data/dataset/GDP-China.csv'
# 指定數據類型
pd.read_csv(data, dtype=np.float64) # 所有數據均為此數據類型
pd.read_csv(data, dtype={
'c1':np.float64, 'c2': str}).info() # 指定字段的類型
pd.read_csv(data, dtype=[datetime,datetime,str,float]) #依次指定

 跳過指定行

#跳過指定行
pd.read_csv(data,skiprows=2) #跳過前兩行
pd.read_csv(data,skiprows=range(2)) #跳過前兩行
pd.read_csv(data,skiprows=[24,235,65]) #跳過指定行
pd.read_csv(data,skiprows=np.array([24,235,65])) #跳過指定行
pd.read_csv(data,skiprows=lambda x:x%2!=0) #隔行跳過
pd.read_csv(data,skipfooter=1) #從尾部跳過
pd.read_csv(data,skip_black_lines=True)#跳過空行

讀取指定行數

#讀取指定行數
pd.read_csv(data,nrows=1000)

 空值替換

#空值替換
pd.read_csv(data,na_values=[0]) #0會被認為是缺失值
pd.read_csv(data,na_values='?') #?會被認為是缺失值
pd.read_csv(data,na_values='abc') #abc會被認為缺失值 等價['a','b','c']
pd.read_csv(data,na_values={'c':3,1:[2,5]}) #指定列被指定為NaN

解析日期時間

# 解析日期時間
data = 'D:/AAA最近要用/數學建模/22美賽/數據/LBMA-GOLD.csv'
pd.read_csv(data, parse_dates=True).info()# 自動解析日期時間格式
pd.read_csv(data, parse_dates=['Date']).info() # 指定日期時間字段進行解析
# 將 0,1,2 列合並解析成名為 時間的 時間類型列
pd.read_csv('D:/AAA最近要用/深度學習/自己的項目/風力發電/少一點.csv', parse_dates={'時間':[0,1,2]}).info()
#保留原來的列
pd.read_csv('D:/AAA最近要用/深度學習/自己的項目/風力發電/少一點.csv', parse_dates={'時間':[0,1,2]},keep_date_col=True).info()
#日期在月份前的數據
pd.read_csv(data,dayfist=True,parse_dates=[0])
# 指定時間解析庫,默認是 dateutil.parser.parser
date_parser=pd.io.date_converters.parse_date_time
date_parser=lambda x: pd.to_datetime(x, utc=True, format='%D%M%Y')
date_parser=lambda d: pd.datetime.strptime(d,'%d%b%Y')
pd.read_csv(data, date_parser=date_parser)
#嘗試轉化為日期
pd.read_csv(data, date_parser=date_parser,infer_datetime_format=True)

讀取壓縮包

#讀取壓縮包
pd.read_csv('sample.tar.gz',compression='gzip')
#指定讀取編碼
pd.read_csv('gairuo.csv',encoding='utf-8')
pd.read_csv('gairuo.csv',encoding='gk2312')#中文

 符號

#符號
pd.read_csv('test.csv',thousands=',')#千分位分隔符
pd.read_csv('test.csv',decimal=',,')#小數點,默認'.'
pd.read_csv(StringIO(data),escapechar='\n',encoding='utf-8')#過濾換行符
pd.read_csv(StringIO(s),sep=',',comment='#',skiprows=1) #一行有'#'就將跳過

csv文件導出

df.to_csv('done.csv')
df.to_csv('data/done.csv') # 可以指定文件目錄路徑
df.to_csv('done.csv', index=False) # 不要索引
f.to_csv('done.csv', encoding='utf-8') #指定編碼
#還可以用sep指定分隔符
df.Q1.to_csv('Q1_test.txt', index=None) # 指定一列導出 txt 格式文件

 導出壓縮包

df=pd.read_csv('https://www.gairuo.com/file/data/dataset/GDP-China.csv')
#創建一個包含out.csv的壓縮文件out.zip
com_opts=dict(method='zip',archive_name='out.csv')
df.to_csv('out.zip',encoding='gbk',index=False,compression=com_opts)

 

讀取 Excel

excel需要這個前置包 openpyxl

pd.read_excel('team.xlsx')
pd.read_excel('https://www.gairuo.com/file/data/dataset/team.xlsx')

 excel表多個sheet

#excel表多個sheet
xlsx = pd.ExcelFile('data.xlsx')
df = pd.read_excel(xlsx, 'Sheet1') # 讀取
xlsx.parse('sheet1') # 取指定標簽為 DataFrame
# Excel 的所有標簽
xlsx.sheet_names # ['sheet1', 'sheet2', 'sheet3', 'sheet4']

 指定讀取sheet

#指定讀取sheet
pd.read_excel('team.xlsx', sheet_name=1) #第二個sheet
pd.read_excel('team.xlsx', sheet_name='總結') #名稱
#讀取多個sheet
pd.read_excel('team.xlsx', sheet_name=[0,1,'Sheet5'])#讀取第一個第二個,第五個sheet,組成df字典
dfs=pd.read_excel('team.xlsx', sheet_name=None) #所有sheet
dfs['Sheet5']

 execl 導出

# 使用 ExcelFile 保存文件對象
df.to_excel('file.xlsx',sheet_name='sheet2',index=False)

多個sheet

df1=df.describe()
# 可以把多個 Sheet 存入 ExcelFile
with pd.ExcelWriter('path_to_file.xlsx') as xls:
df1.to_excel(xls, 'Sheet1')
df.to_excel(xls, 'Sheet2',index=False)

 

網頁文件讀取

dfs = pd.read_html('https://www.gairuo.com/p/pandas-io')
dfs[0] # 查看第一個 df

 

dfs = pd.read_html('data.html', header=0) #讀取網頁文件,第一行為表頭
dfs = pd.read_html(url, index_col=0)# 第一列為索引
#表格很多可以指定元素獲取
dfs1 = pd.read_html(url, attrs={'id': 'table'}) # id='table' 的表格,注意這兒仍然可能返回多個
# dfs1[0]
dfs2 = pd.read_html(url, attrs={'class': 'sortable'})# class='sortable'
# !!! 常用的功能與 read_csv 相同,可參考上文

網頁文件導出

df.to_html('網頁文件.html')
df.to_html('網頁文件.html',columns=[0])#輸出指定列
df.to_html('網頁文件.html',classes=['class1','class2'])#輸出指定樣式

json讀取

pd.read_json('data.json')
json = '''{"columns":["col 1","col 2"],
"index":["row 1","row 2"],
"data":[["a","b"],["c","d"]]}
'''
pd.read_json(json)
pd.read_json(json, orient='split') # json 格式

''' orient 支持:

  • 'split' : dict like {index -> [index], columns -> [columns], data -> [values]}
  • 'records' : list like [{column -> value}, ... , {column -> value}]
  • 'index' : dict like {index -> {column -> value}}
  • 'columns' : dict like {column -> {index -> value}} '''

json輸出 

df = pd.DataFrame([['a', 'b'], ['c', 'd']],
index=['row 1', 'row 2'],
columns=['col 1', 'col 2'])
# 輸出 json 字符串
df.to_json(orient='split')

 


剪貼板讀取 

比如我去復制一下東方財富網的一個數據:

 然後在Python輸入

pd.read_clipboard(header=None)

可以得到 

 很方便


剪貼板輸出

df = pd.DataFrame({'A': [1, 2, 3],
'B': [4, 5, 6],
'C': ['p', 'q', 'r']},
index=['x', 'y', 'z'])
df.to_clipboard()

這樣就可以把df的東西到處復制去了


 

markdowm導出

print(df.to_markdown())

 

其他文件讀取

數據分析還有spss文件,sas文件,stata文件等,都可以用pandas讀取

pd.read_stata('file.dta')#讀取stata文件
pd.read_spss('file.sav')#讀取spss文件
pd.read_sas#讀取sas
pd.read_sql#讀取sql
#讀取有固定列寬的數據
colspecs = [(0, 6), (8, 20), (21, 33), (34, 43)]
pd.read_fwf('demo.txt', colspecs=colspecs, header=None, index_col=0)


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved