1 本文適合讀者
剛開始學習Pandas的新手
2 環境
Python 3.7.0
Pandas 0.23.4
NumPy 1.15.2
import numpy as np
import pandas as pd
3 測試文件
這是一個常見的水果銷量表,每個月每種水果的單價、數量、和銷售金額 用逗號分隔開的內容粘貼到文本文件 a.csv: 月份,水果,數量,單價,金額 201801,蘋果,65,2.3,149.50 201802,蘋果,101,2.3,232.30 201803,蘋果,113,2.5,282.50 201804,蘋果,145,2.5,362.50 201805,蘋果,145,2.5,362.50 201806,蘋果,167,2.8,467.60 201807,蘋果,203,2.8,568.40 201808,蘋果,255,2.9,739.50 201801,香蕉,180,3.5,630.00 201802,香蕉,201,3.5,703.50 201803,香蕉,223,3.5,780.50 201804,香蕉,254,3.9,990.60 201805,香蕉,267,3.9,1041.30 201806,香蕉,213,4.4,937.20 201807,香蕉,280,4.4,1232.00 201808,香蕉,310,4.4,1364.00 201801,西瓜,400,3.8,1520.00 201802,西瓜,450,3.8,1710.00 201803,西瓜,481,3.5,1683.50 201804,西瓜,495,3.5,1732.50 201805,西瓜,580,3.2,1856.00 201806,西瓜,610,3.2,1952.00 201807,西瓜,688,2.5,1720.00 201808,西瓜,753,1.8,1355.40
4 read_csv方法和主要參數
df = pd.read_csv(filepath/filename,sep=',',delimiter=None,header='infer',names=None)
4.1 不加任何參數
df = pd.read_csv('a.csv')
文件名用單引號擴起來,pandas能正常解析csv文件,
文件第一行的列名會自動成為df對象的列名。
df.columns
Index(['月份', '水果', '數量', '單價', '金額'], dtype='object')
4.2 指定csv文件的分隔符
df = pd.read_csv('a.csv',sep=',')
用sep來指定csv文件的分隔符,sep的默認值是“,”,
一般csv文件的分隔符都是“,”,因此這里可以省略,pandas解析的結果同4.1。
如果csv文件用制表符Tab分隔,那么這里必須指定sep='\t'。
delimiter參數是sep參數的另一種寫法,兩個只要寫一個就可以了。
4.3 指定列名
標題行參數header,默認值是'infer',也就是在沒有指定列名時,相當于 header=0 且列名用第一行的內容作為各列的列名;
# header=0默認可以省略,表示用第一行作列名
df = pd.read_csv('a.csv',header=0)
# header=1表示用第二行作列名
df = pd.read_csv('a.csv',header=1)
# 結果列名變成 Index(['201801', '蘋果', '65', '2.3', '149.50'], dtype='object')
如果要指定列名,則需要將 header=None ,然后用names參數傳入列名。
當 header=None ,但不傳入列名時,pandas自動用數字序列作列名:
df = pd.read_csv('a.csv',header=None)
結果是列名變成[0, 1, 2, 3, 4],csv文件的第一行被作為數據看待
0 1 2 3 4
0 月份 水果 數量 單價 金額
1 201801 蘋果 65 2.3 149.50
2 201802 蘋果 101 2.3 232.30
3 201803 蘋果 113 2.5 282.50
通過names參數可以指定列名,names是一個列表:
df = pd.read_csv('a.csv',header=None,names=['month','fruit','count','price','amount'])
結果可以看到列名從0,1,2,3,4變成了指定的列名:
month fruit count price amount
0 月份 水果 數量 單價 金額
1 201801 蘋果 65 2.3 149.50
2 201802 蘋果 101 2.3 232.30
3 201803 蘋果 113 2.5 282.50
也就是說,當原始csv文件的第一行不是列名時,可以通過 header=None, names=list 來傳入指定的列名。
這里,原始csv文件的第一行被作為數據很討厭,可以通過 header=0 來達到替換列名的效果:
df = pd.read_csv('a.csv',header=0,names=['month','fruit','count','price','amount'])
結果可以看到csv文件的第一行被替換成了新的列名:
month fruit count price amount
0 201801 蘋果 65 2.3 149.5
1 201802 蘋果 101 2.3 232.3
2 201803 蘋果 113 2.5 282.5
3 201804 蘋果 145 2.5 362.5
5 其他參數解釋
.read_csv(filepath_or_buffer, sep=’, ‘, delimiter=None, header=’infer’, names=None, index_col=None, usecols=None, squeeze=False, prefix=None, mangle_dupe_cols=True, dtype=None, engine=None, converters=None, true_values=None, false_values=None, skipinitialspace=False, skiprows=None, nrows=None, na_values=None, keep_default_na=True, na_filter=True, verbose=False, skip_blank_lines=True, parse_dates=False, infer_datetime_format=False, keep_date_col=False, date_parser=None, dayfirst=False, iterator=False, chunksize=None, compression=’infer’, thousands=None, decimal=b’.’, lineterminator=None, quotechar=’”’, quoting=0, escapechar=None, comment=None, encoding=None, dialect=None, tupleize_cols=None, error_bad_lines=True, warn_bad_lines=True, skipfooter=0, skip_footer=0, doublequote=True, delim_whitespace=False, as_recarray=None, compact_ints=None, use_unsigned=None, low_memory=True, buffer_lines=None, memory_map=False, float_precision=None)
filepath_or_buffer : 路徑 URL 可以是http, ftp, s3, 和 file.
sep: 指定分割符,默認是’,’C引擎不能自動檢測分隔符,但Python解析引擎可以
delimiter: 同sep
delimiter_whitespace: True or False 默認False, 用空格作為分隔符等價于spe=’\s+’如果該參數被調用,則delimite不會起作用
header: 指定第幾行作為列名(忽略注解行),如果沒有指定列名,默認header=0; 如果指定了列名header=None
names 指定列名,如果文件中不包含header的行,應該顯性表示header=None
index_col: 默認為None 用列名作為DataFrame的行標簽,如果給出序列,則使用MultiIndex。如果讀取某文件,該文件每行末尾都有帶分隔符,考慮使用index_col=False使panadas不用第一列作為行的名稱。
usecols: 默認None 可以使用列序列也可以使用列名,如 [0, 1, 2] or [‘foo’, ‘bar’, ‘baz’]
as_recarray:默認False , 將讀入的數據按照numpy array的方式存儲,0.19.0版本后使用
pd.read_csv(…).to_records()。 注意,這種方式讀入的na數據不是顯示na,而是給以個莫名奇妙的值
squeeze: 默認為False, True的情況下返回的類型為Series
prefix:默認為none, 當header =None 或者沒有header的時候有效,例如’x’ 列名效果 X0, X1, …
mangle_dupe_cols :默認為True,重復的列將被指定為’X.0’…’X.N’,而不是’X’…’X’。如果傳入False,當列中存在重復名稱,則會導致數據被覆蓋。
dtype: E.g. {‘a’: np.float64, ‘b’: np.int32} 指定數據類型
engine: {‘c’, ‘python’}, optional 選擇讀取的引擎目前來說C更快,但是Python的引擎有更多選擇的操作
skipinitialspace: 忽略分隔符后的空格,默認false,
skiprows: list-like or integer or callable, default None 忽略某幾行或者從開始算起的幾行
skipfooter: 從底端算起的幾行,不支持C引擎
nrows: int 讀取的行數
na_values: 默認None NaN包含哪些情況,默認情況下, ‘#N/A’, ‘#N/A N/A’, ‘#NA’, ‘-1.#IND’, ‘-1.#QNAN’, ‘-NaN’, ‘-nan’, ‘1.#IND’, ‘1.#QNAN’, ‘N/A’, ‘NA’, ‘NULL’, ‘NaN’, ‘n/a’, ‘nan’, ‘null’. 都表現為NAN
keep_default_na: 如果na_values被定義,keep_default_na為False那么默認的NAN會被改寫。 默認為True
na_filter: 默認為True, 針對沒有NA的文件,使用na_filter=false能夠提高讀取效率
skip_blank_lines 默認為True,跳過blank lines 而且不是定義為NAN
thousands 千分位符號,默認‘,’
decimal 小數點符號,默認‘.’
encoding: 編碼方式
memory_map如果為filepath_or_buffer提供了文件路徑,則將文件對象直接映射到內存上,并直接從那里訪問數據。使用此選項可以提高性能,因為不再有任何I / O開銷。
low_memory 默認為True 在塊內部處理文件,導致分析時內存使用量降低,但可能數據類型混亂。要確保沒有混合類型設置為False,或者使用dtype參數指定類型。請注意,不管怎樣,整個文件都讀入單個DataFrame中,請使用chunksize或iterator參數以塊形式返回數據。 (僅在C語法分析器中有效)
parse_dates : boolean or list of ints or names or list of lists or dict, default False
boolean. True -> 解析索引
list of ints or names. e.g. If [1, 2, 3] -> 解析1,2,3列的值作為獨立的日期列;
list of lists. e.g. If [[1, 3]] -> 合并1,3列作為一個日期列使用
dict, e.g. {‘foo’ : [1, 3]} -> 將1,3列合并,并給合并后的列起名為"foo"
infer_datetime_format : boolean, default False
如果設定為True并且parse_dates 可用,那么pandas將嘗試轉換為日期類型,如果可以轉換,轉換方法并解析。在某些情況下會快5~10倍。
keep_date_col : boolean, default False
如果連接多列解析日期,則保持參與連接的列。默認為False。
date_parser : function, default None
用于解析日期的函數,默認使用dateutil.parser.parser來做轉換。Pandas嘗試使用三種不同的方式解析,如果遇到問題則使用下一種方式。
1.使用一個或者多個arrays(由parse_dates指定)作為參數;
2.連接指定多列字符串作為一個列作為參數;
3.每行調用一次date_parser函數來解析一個或者多個字符串(由parse_dates指定)作為參數。
dayfirst : boolean, default False
DD/MM格式的日期類型
iterator : boolean, default False
返回一個TextFileReader 對象,以便逐塊處理文件。
lineterminator : str (length 1), default None
行分割符,只在C解析器下使用。
quotechar : str (length 1), optional
引號,用作標識開始和解釋的字符,引號內的分割符將被忽略。
quoting : int or csv.QUOTE_* instance, default 0
控制csv中的引號常量??蛇x QUOTE_MINIMAL (0), QUOTE_ALL (1), QUOTE_NONNUMERIC (2) or QUOTE_NONE (3)
doublequote : boolean, default True
雙引號,當單引號已經被定義,并且quoting 參數不是QUOTE_NONE的時候,使用雙引號表示引號內的元素作為一個元素使用
low_memory : boolean, default True
分塊加載到內存,再低內存消耗中解析。但是可能出現類型混淆。確保類型不被混淆需要設置為False?;蛘呤褂胐type 參數指定類型。注意使用chunksize 或者iterator 參數分塊讀入會將整個文件讀入到一個Dataframe,而忽略類型(只能在C解析器中有效)
5 導入時間字段
數據字段的格式如下:
inDate
2017-01-18 00:00:01
導入方法:
dateparse = lambda dates: pd.datetime.strptime(dates, '%Y-%m-%d %H:%M:%S')
df = pd.read_csv("a.csv",parse_dates=[0],date_parser=dateparse)
parse_dates:這是指定含有時間數據的列,用一個列表或者字典來指定要解析的列。