1 數(shù)據(jù)展示與文件讀寫
1.1 數(shù)據(jù)展示
- 讀取.csv數(shù)據(jù)
import pandas as pd
df = pd.read_csv('loandata.csv')
df
- 展示部分?jǐn)?shù)據(jù):三種方式
df.head(n) #展示前n個(gè)樣本葱弟,n默認(rèn)為5
df.tail(n) #展示末尾n個(gè)樣本
df.sample() #從數(shù)據(jù)中隨機(jī)采樣n個(gè)樣本
其他讀取不同文件格式的接口
- 相關(guān)讀寫函數(shù)將數(shù)據(jù)化為DataFrame的一些技術(shù):
- 不規(guī)整數(shù)據(jù)就處理:在讀取數(shù)據(jù)文件時(shí)跳過一些行幌缝、頁(yè)腳补憾、注釋等献汗。
- 日期解析:組合功能泊藕,如將多個(gè)列的日期信息合并為一列已骇。
- 索引:讀取文件時(shí)闭翩,選擇是否從文件中讀取列名。
- 類型推斷和數(shù)據(jù)轉(zhuǎn)換:包括用戶定義值的轉(zhuǎn)換浸船、缺失值等妄迁。
- 迭代:支持對(duì)大文件逐塊迭代。
- 參數(shù)設(shè)定
fixed_df = pd.read_csv('loandata_chi.csv', sep=';', encoding='gbk’,
parse_dates=['...'], index_col='...')
filepath_or_buffer : str糟袁,pathlib判族。str, pathlib.Path, py._path.local.LocalPath or any object with a read() method (such as a file handle or StringIO)
可以是URL躺盛,可用URL類型包括:http, ftp, s3和文件项戴。對(duì)于多文件正在準(zhǔn)備中
sep : str, default ‘,’
指定分隔符。如果不指定參數(shù)槽惫,則會(huì)嘗試使用逗號(hào)分隔周叮。分隔符長(zhǎng)于一個(gè)字符并且不是‘\s+’,將使用python的語法分析器。并且忽略數(shù)據(jù)中的逗號(hào)界斜。正則表達(dá)式例子:'\r\t'
delimiter : str, default None
定界符仿耽,備選分隔符(如果指定該參數(shù),則sep參數(shù)失效)
delim_whitespace : boolean, default False.
指定空格(例如’ ‘或者’ ‘)是否作為分隔符使用各薇,等效于設(shè)定sep='\s+'项贺。如果這個(gè)參數(shù)設(shè)定為Ture那么delimiter 參數(shù)失效。
header : int or list of ints, default ‘infer’
指定行數(shù)用來作為列名峭判,數(shù)據(jù)開始行數(shù)开缎。如果文件中沒有列名,則默認(rèn)為0林螃,否則設(shè)置為None奕删。如果明確設(shè)定header=0 就會(huì)替換掉原來存在列名。header參數(shù)可以是一個(gè)list例如:[0,1,3]疗认,這個(gè)list表示將文件中的這些行作為列標(biāo)題(意味著每一列有多個(gè)標(biāo)題)完残,介于中間的行將被忽略掉(例如本例中的2伏钠;本例中的數(shù)據(jù)1,2,4行將被作為多級(jí)標(biāo)題出現(xiàn),第3行數(shù)據(jù)將被丟棄谨设,dataframe的數(shù)據(jù)從第5行開始熟掂。)。
注意:如果skip_blank_lines=True 那么header參數(shù)忽略注釋行和空行扎拣,所以header=0表示第一行數(shù)據(jù)而不是文件的第一行打掘。
names: array-like, default None
用于結(jié)果的列名列表,如果數(shù)據(jù)文件中沒有列標(biāo)題行鹏秋,就需要執(zhí)行header=None尊蚁。默認(rèn)列表中不能出現(xiàn)重復(fù),除非設(shè)定參數(shù)mangle_dupe_cols=True侣夷。
index_col : int or sequence or False, default None
用作行索引的列編號(hào)或者列名横朋,如果給定一個(gè)序列則有多個(gè)行索引。
如果文件不規(guī)則百拓,行尾有分隔符琴锭,則可以設(shè)定index_col=False 來是的pandas不適用第一列作為行索引。
usecols : array-like, default None
返回一個(gè)數(shù)據(jù)子集衙传,該列表中的值必須可以對(duì)應(yīng)到文件中的位置(數(shù)字可以對(duì)應(yīng)到指定的列)或者是字符傳為文件中的列名决帖。例如:usecols有效參數(shù)可能是 [0,1,2]或者是 [‘foo’, ‘bar’, ‘baz’]。使用這個(gè)參數(shù)可以加快加載速度并降低內(nèi)存消耗蓖捶。
as_recarray : boolean, default False
不贊成使用:該參數(shù)會(huì)在未來版本移除地回。請(qǐng)使用pd.read_csv(...).to_records()替代。
返回一個(gè)Numpy的recarray來替代DataFrame俊鱼。如果該參數(shù)設(shè)定為True刻像。將會(huì)優(yōu)先squeeze參數(shù)使用。并且行索引將不再可用并闲,索引列也將被忽略细睡。
squeeze: boolean, default False
如果文件值包含一列,則返回一個(gè)Series
prefix: str, default None
在沒有列標(biāo)題時(shí)帝火,給列添加前綴溜徙。例如:添加‘X’ 成為 X0, X1, ...
mangle_dupe_cols: boolean, default True
重復(fù)的列,將‘X’...’X’表示為‘X.0’...’X.N’犀填。如果設(shè)定為false則會(huì)將所有重名列覆蓋蠢壹。
dtype : Type name or dict of column -> type, default None
每列數(shù)據(jù)的數(shù)據(jù)類型。例如 {‘a(chǎn)’: np.float64, ‘b’: np.int32}
engine: {‘c’, ‘python’}, optional
Parser engine to use. The C engine is faster while the python engine is currently more feature-complete.
使用的分析引擎宏浩≈校可以選擇C或者是python。C引擎快但是Python引擎功能更加完備。
converters : dict, default None
列轉(zhuǎn)換函數(shù)的字典求妹。key可以是列名或者列的序號(hào)乏盐。
true_values : list, default None
Values to consider as True
false_values : list, default None
Values to consider as False
skipinitialspace: boolean, default False
忽略分隔符后的空白(默認(rèn)為False,即不忽略).
skiprows : list-like or integer, default None
需要忽略的行數(shù)(從文件開始處算起)制恍,或需要跳過的行號(hào)列表(從0開始)父能。
skipfooter : int, default 0
從文件尾部開始忽略。 (c引擎不支持)
skip_footer : int, default 0
不推薦使用:建議使用skipfooter 净神,功能一樣何吝。
nrows : int, default None
需要讀取的行數(shù)(從文件頭開始算起)。
na_values : scalar, str, list-like, or dict, default None
一組用于替換NA/NaN的值鹃唯。如果傳參爱榕,需要制定特定列的空值。默認(rèn)為‘1.#IND’, ‘1.#QNAN’, ‘N/A’, ‘NA’, ‘NULL’, ‘NaN’, ‘nan’`.
keep_default_na: bool, default True
如果指定na_values參數(shù)坡慌,并且keep_default_na=False黔酥,那么默認(rèn)的NaN將被覆蓋,否則添加洪橘。
na_filter: boolean, default True
是否檢查丟失值(空字符串或者是空值)跪者。對(duì)于大文件來說數(shù)據(jù)集中沒有空值,設(shè)定na_filter=False可以提升讀取速度熄求。
verbose : boolean, default False
是否打印各種解析器的輸出信息渣玲,例如:“非數(shù)值列中缺失值的數(shù)量”等。
skip_blank_lines : boolean, default True
如果為True弟晚,則跳過空行忘衍;否則記為NaN。
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列的值作為獨(dú)立的日期列指巡;
- list of lists. e.g. If [[1, 3]] -> 合并1,3列作為一個(gè)日期列使用
- dict, e.g. {‘foo’ : [1, 3]} -> 將1,3列合并淑履,并給合并后的列起名為"foo"
infer_datetime_format : boolean, default False
如果設(shè)定為True并且parse_dates 可用隶垮,那么pandas將嘗試轉(zhuǎn)換為日期類型藻雪,如果可以轉(zhuǎn)換证杭,轉(zhuǎn)換方法并解析扣孟。在某些情況下會(huì)快5~10倍。
keep_date_col: boolean, default False
如果連接多列解析日期粗蔚,則保持參與連接的列蹋偏。默認(rèn)為False便斥。
date_parser : function, default None
用于解析日期的函數(shù),默認(rèn)使用dateutil.parser.parser來做轉(zhuǎn)換威始。Pandas嘗試使用三種不同的方式解析枢纠,如果遇到問題則使用下一種方式。
1.使用一個(gè)或者多個(gè)arrays(由parse_dates指定)作為參數(shù)黎棠;
2.連接指定多列字符串作為一個(gè)列作為參數(shù)晋渺;
3.每行調(diào)用一次date_parser函數(shù)來解析一個(gè)或者多個(gè)字符串(由parse_dates指定)作為參數(shù)镰绎。
dayfirst: boolean, default False
DD/MM格式的日期類型
iterator: boolean, default False
返回一個(gè)TextFileReader 對(duì)象,以便逐塊處理文件木西。
chunksize : int, default None (用于分塊讀瘸肫堋)
文件塊的大小, See IO Tools docs for more informationon iterator and chunksize.
compression : {‘infer’, ‘gzip’, ‘bz2’, ‘zip’, ‘xz’, None}, default ‘infer’
直接使用磁盤上的壓縮文件八千。如果使用infer參數(shù)吗讶,則使用 gzip, bz2, zip或者解壓文件名中以‘.gz’, ‘.bz2’, ‘.zip’, or ‘xz’這些為后綴的文件,否則不解壓恋捆。如果使用zip照皆,那么ZIP包中必須只包含一個(gè)文件。設(shè)置為None則不解壓沸停。
新版本0.18.1版本支持zip和xz解壓
thousands : str, default None
千分位分割符纵寝,如“,”或者“."
decimal : str, default ‘.’
字符中的小數(shù)點(diǎn) (例如:歐洲數(shù)據(jù)使用’星立,‘).
float_precision : string, default None
Specifies which converter the C engine should use for floating-point values. The options are None for the ordinary converter, high for the high-precision converter, and round_trip for the round-trip converter.
lineterminator: str (length 1), default None
行分割符爽茴,只在C解析器下使用。
quotechar: str (length 1), optional
引號(hào)绰垂,用作標(biāo)識(shí)開始和解釋的字符室奏,引號(hào)內(nèi)的分割符將被忽略。
quoting : int or csv.QUOTE_* instance, default 0
控制csv中的引號(hào)常量劲装‰誓可選 QUOTE_MINIMAL (0), QUOTE_ALL (1), QUOTE_NONNUMERIC (2) or QUOTE_NONE (3)
doublequote : boolean, default True
雙引號(hào),當(dāng)單引號(hào)已經(jīng)被定義占业,并且quoting 參數(shù)不是QUOTE_NONE的時(shí)候绒怨,使用雙引號(hào)表示引號(hào)內(nèi)的元素作為一個(gè)元素使用。
escapechar : str (length 1), default None
當(dāng)quoting 為QUOTE_NONE時(shí)谦疾,指定一個(gè)字符使的不受分隔符限值南蹂。
comment : str, default None
標(biāo)識(shí)著多余的行不被解析。如果該字符出現(xiàn)在行首念恍,這一行將被全部忽略六剥。這個(gè)參數(shù)只能是一個(gè)字符,空行(就像skip_blank_lines=True)注釋行被header和skiprows忽略一樣峰伙。例如如果指定comment='#' 解析‘#empty\na,b,c\n1,2,3’ 以header=0 那么返回結(jié)果將是以’a,b,c'作為header疗疟。
encoding : str, default None
指定字符集類型,通常指定為'utf-8'. List of Python standard encodings
dialect : str or csv.Dialect instance, default None
如果沒有指定特定的語言瞳氓,如果sep大于一個(gè)字符則忽略策彤。具體查看csv.Dialect 文檔
tupleize_cols : boolean, default False
Leave a list of tuples on columns as is (default is to convert to a Multi Index on the columns)
error_bad_lines : boolean, default True
如果一行包含太多的列,那么默認(rèn)不會(huì)返回DataFrame ,如果設(shè)置成false店诗,那么會(huì)將改行剔除(只能在C解析器下使用)叽赊。
warn_bad_lines : boolean, default True
如果error_bad_lines =False,并且warn_bad_lines =True 那么所有的“bad lines”將會(huì)被輸出(只能在C解析器下使用)必搞。
low_memory: boolean, default True
分塊加載到內(nèi)存必指,再低內(nèi)存消耗中解析。但是可能出現(xiàn)類型混淆恕洲。確保類型不被混淆需要設(shè)置為False塔橡。或者使用dtype 參數(shù)指定類型霜第。注意使用chunksize 或者iterator 參數(shù)分塊讀入會(huì)將整個(gè)文件讀入到一個(gè)Dataframe葛家,而忽略類型(只能在C解析器中有效)
如果整數(shù)列被壓縮(i.e. compact_ints=True),指定被壓縮的列是有符號(hào)還是無符號(hào)的泌类。
memory_map : boolean, default False
如果使用的文件在內(nèi)存內(nèi)癞谒,那么直接map文件使用。使用這種方式可以避免文件再次進(jìn)行IO操作刃榨。
- 讀取任一大小的塊
df = pd.read_csv('loandata.csv', iterator=True)
df.get_chunk(4)
1.2 文件讀寫
讀取loandata.csv文件弹砚,將得到的數(shù)據(jù)存為loandata3.csv
df = pd.read_csv('loandata.csv', nrows=3)
df.to_csv('loandata_3.csv’)
輸出時(shí)可以使用sys.stdout把最終存在文件中的內(nèi)容打印出來輸出在屏幕上。
import sys
df.to_csv(sys.stdout)
此時(shí)的輸出結(jié)果會(huì)將位置也存入文件枢希,這除非在索引列示自定義的情況下都是不必要的
- 制定grade為索引列
df = pd.read_csv('loandata.csv', nrows=3, index_col='grade')
df.to_csv(sys.stdout)
- 一般情況,設(shè)置index=False
df = pd.read_csv('loandata.csv', nrows=3)
df.to_csv(sys.stdout, index=False)
- Excel文件讀寫
Excel文件一般使用制表符分隔列桌吃,可能存在多個(gè)工作表(sheet)。
分別使用read_excel()和to_excel()讀寫苞轿,但注意需要設(shè)置sheetname茅诱。 - 把loandata數(shù)據(jù)存在一個(gè)Excel文件的不同sheet中
import pandas as pd
pd.set_option('display.max_rows', 4)
pd.read_excel('loandata.xls', sheet_name='first')
- 如果sheet_name包含多個(gè)sheet,讀取操作將返回一個(gè)有序詞典OrderedDict搬卒,每個(gè)sheet的數(shù)據(jù)可以通過字典索引方式得到瑟俭。
df = pd.read_excel('loandata.xls’,
sheet_name=['first', 'second'])
df['second']
2 數(shù)據(jù)類型和數(shù)據(jù)篩選
2.1 數(shù)據(jù)類型
Pandas對(duì)象數(shù)據(jù)類型=Python數(shù)據(jù)類型+Numpy數(shù)據(jù)類型:
float,int,bool,datetime64[ns],datetime64[ns,tz],timedelta[ns],category,object
- 數(shù)值型數(shù)據(jù)類型:類型名,加上一個(gè)表示元素位長(zhǎng)的數(shù)字契邀。
-當(dāng)Series只有字符串或有多個(gè)數(shù)據(jù)類型時(shí)摆寄,dtype是object類型。 - DF的dtypes屬性蹂安,可以得到各個(gè)特征的數(shù)據(jù)類型椭迎。
sample.dtypes
- astype()轉(zhuǎn)換數(shù)據(jù)類型
sample['G'] = sample['G'].astype('int32')
sample = sample.astype({'B':'int8', 'G':'int32'}) # 對(duì)多列進(jìn)行轉(zhuǎn)換,采用字典-列名:目標(biāo)數(shù)據(jù)類型
2.2 數(shù)據(jù)篩選
- select_dtypes()篩選特定數(shù)據(jù)類型的特征田盈。
- 兩個(gè)參數(shù):exclude:剔除的;include:選取的
select_dtypes(include=None, exclude=None) # 如果有缴阎,就輸入一個(gè)list
3 描述性匯總統(tǒng)計(jì)
3.1 描述性統(tǒng)計(jì)
參數(shù)axis允瞧,默認(rèn)axis=0對(duì)索引index進(jìn)行操作(即操作后左邊那一列變化),axis=1表示對(duì)列columns進(jìn)行操作(即操作后上面那一行變化)。
df = pd.read_csv('loandata.csv')
df.mean(0) # 可以省略為df.mean()
df.mean(1)[:5] #計(jì)算前5個(gè)樣本的所有數(shù)值型特征的均值
- 驗(yàn)證
df_number = df.select_dtypes(include='number')
df_number.head(1)
df0 = df_number.iloc[0]
df0.mean()
-
使用df.count()查看非缺失值樣本的數(shù)量
3.2 匯總統(tǒng)計(jì)
- describe()方法查看均值述暂、標(biāo)準(zhǔn)差痹升、最大值、最小值畦韭、分位數(shù)疼蛾。也可以對(duì)非數(shù)值型進(jìn)行統(tǒng)計(jì),但指標(biāo)有所不同艺配。默認(rèn)只對(duì)數(shù)值型察郁。可以使用include和exclude方法转唉∑つ疲可以傳入'all'表示所有。
- percentiles參數(shù)顯示哪幾個(gè)分位數(shù)
df.describe(percentiles=[.05, .5, .95])
- info()顯示各列數(shù)據(jù)類型赠法、非空值數(shù)量麦轰、總體樣本數(shù)和所占內(nèi)存。
- cov()和corr()表示協(xié)方差和相關(guān)系數(shù)砖织。
4 算術(shù)運(yùn)算
- Pandas對(duì)象進(jìn)行加減乘除二元運(yùn)算時(shí)款侵,根據(jù)索引自動(dòng)對(duì)齊數(shù)據(jù),存在不同索引對(duì)時(shí)取并集侧纯。不重疊的索引處引入缺失值并且在運(yùn)算過程中自動(dòng)傳播喳坠。
- +-*/可以用add()、sub()茂蚓、mul()壕鹉、div()代替。是對(duì)應(yīng)元素相乘而不是矩陣乘法聋涨。
- DataFrame和Series運(yùn)算時(shí)晾浴,存在廣播行為,可理解為一種匹配行為
- 算術(shù)運(yùn)算默認(rèn)axis=1.
5 缺失值處理
- 通常用NA(Not available)代指牍白,在Pandas數(shù)據(jù)結(jié)構(gòu)用NaN(Not a Number)脊凰。可以用isnull()分析茂腥。
- True和 False在進(jìn)行算術(shù)運(yùn)算時(shí)視為1和0.
- 缺失值填補(bǔ)fillna()
- 使用同一個(gè)值填補(bǔ)
df.fillna(0)
- 使用前一個(gè)值(前向填補(bǔ))或后一個(gè)值(后向填補(bǔ))狸涌,設(shè)置method。
df.fillna(method='ffill') # pad,前向填補(bǔ)
df.fillna(method='bfill') # backfill,后向填補(bǔ)
- 不同列不同值填補(bǔ)最岗,輸入字典
df.fillna({'one':0,'three':1})
- 使用一個(gè)Pandas對(duì)象進(jìn)行填補(bǔ)
df.fillna(df.mean())
6 索引調(diào)整方法
- 更改index(左邊那列)
df.index = [ 'a' , 'b' , 'c' ]
- reindex() :重新索引并得到一個(gè)新的Pandas對(duì)象帕胆。不僅重新索引DataFrame,同時(shí)也實(shí)現(xiàn)過濾功能般渡。
df.reindex(['b', 'c', 'e'])
df.reindex(columns=['two', 'three', 'four'])
- 如果使用某一列作為索引懒豹,使用set_index()
df.set_index('two')
- 修改索引或列名芙盘,使用rename()
df.rename({'a':'A', 'b':'B', 'c':'C'})
df.rename(columns=str.upper)
df.rename(columns=lambda x:x[:2].upper()+x[2:].lower())
7 層次化索引
- 使用列表創(chuàng)建有多級(jí)別索引的Series
data = pd.Series(np.random.randn(5),index=[['a', 'a', 'b', 'b', 'b'],['a1', 'a2', 'b1', 'b2', 'b3']])
data.index
# MultiIndex(levels=[['a', 'b'], ['a1', 'a2', 'b1', 'b2', 'b3']],labels=[[0, 0, 1, 1, 1], [0, 1, 2, 3, 4]])
- 索引是MultiIndex對(duì)象,levels包含每個(gè)級(jí)別索引的標(biāo)簽脸秽,labels每個(gè)數(shù)據(jù)在不同leels的位置標(biāo)記儒老。對(duì)每個(gè)數(shù)據(jù)而言,索引是個(gè)元組记餐。
tuples = [('a', 'a1'), ('a', 'a2'), ('b', 'b1'), ('b', 'b2'), ('b', 'b3')]
pd.Series(np.random.randn(5), index=tuples)
- 創(chuàng)建一個(gè)層次化索引:
pd.MultiIndex.from_arrays(arrays)
pd.MultiIndex.from_tuples(tuples)
pd.MultiIndex.from_product(iterable)
arrays = np.array([['a', 'a', 'a', 'b', 'b', 'b'], ['x', 'y', 'z', 'x', 'y', 'z']])
tuples = [('a', 'x'), ('a', 'y'), ('a', 'z'), ('b', 'x'), ('b', 'y'), ('b', 'z')]
iterable = [['a', 'b'], ['x', 'y', 'z']]
#MultiIndex(levels=[['a', 'b'], ['x', 'y', 'z']],labels=[[0, 0, 0, 1, 1, 1], [0, 1, 2, 0, 1, 2]])
index = pd.MultiIndex.from_product(iterable)
data = pd.Series(np.random.randn(6), index=index)
data.index.names = ['first', 'second']
data.index
#MultiIndex(levels=[['a', 'b'], ['x', 'y', 'z']],labels=[[0, 0, 0, 1, 1, 1],[0, 1, 2, 0, 1, 2]],names=['first', 'second'])
- DF
- 重排級(jí)別順序
df.swaplevel(0,1,axis=1)
df.reorder_levels([1,0],axis=1)
- 提取部分?jǐn)?shù)據(jù):使用.loc()和.iloc()驮樊,首先通過.loc(axis)制定對(duì)行索引還是對(duì)列索引
df.loc(axis=0)[:,'x']
- 對(duì)任意級(jí)別,用xs()方法
df.xs('x',level=1,axis=0)
- stack()和unstack()
stack():上到左片酝,unstack():左到上 - reset_index()重置層級(jí)索引囚衔,提取index級(jí)別level放入columns級(jí)別col_level
df.reset_index(level=1,col_level=1)
(根據(jù)《Python數(shù)據(jù)分析基礎(chǔ)》整理)