Python 數(shù)據(jù)初步探索和數(shù)據(jù)預(yù)處理

1 數(shù)據(jù)展示與文件讀寫(xiě)

1.1 數(shù)據(jù)展示

  • 讀取.csv數(shù)據(jù)
import pandas as pd
df = pd.read_csv('loandata.csv')
df
數(shù)據(jù)讀取.png
  • 展示部分?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è)樣本

其他讀取不同文件格式的接口


讀取不同文件格式.png
  • 相關(guān)讀寫(xiě)函數(shù)將數(shù)據(jù)化為DataFrame的一些技術(shù):
  1. 不規(guī)整數(shù)據(jù)就處理:在讀取數(shù)據(jù)文件時(shí)跳過(guò)一些行、頁(yè)腳、注釋等。
  2. 日期解析:組合功能,如將多個(gè)列的日期信息合并為一列。
  3. 索引:讀取文件時(shí),選擇是否從文件中讀取列名。
  4. 類型推斷和數(shù)據(jù)轉(zhuǎn)換:包括用戶定義值的轉(zhuǎn)換、缺失值等。
  5. 迭代:支持對(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的語(yǔ)法分析器。并且忽略數(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ù)用來(lái)作為列名,數(shù)據(jù)開(kāi)始行數(shù)。如果文件中沒(méi)有列名,則默認(rèn)為0,否則設(shè)置為None。如果明確設(shè)定header=0 就會(huì)替換掉原來(lái)存在列名。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行開(kāi)始。)。
注意:如果skip_blank_lines=True 那么header參數(shù)忽略注釋行和空行,所以header=0表示第一行數(shù)據(jù)而不是文件的第一行。

names: array-like, default None

用于結(jié)果的列名列表,如果數(shù)據(jù)文件中沒(méi)有列標(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 來(lái)是的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ì)在未來(lái)版本移除。請(qǐng)使用pd.read_csv(...).to_records()替代。

返回一個(gè)Numpy的recarray來(lái)替代DataFrame。如果該參數(shù)設(shè)定為True。將會(huì)優(yōu)先squeeze參數(shù)使用。并且行索引將不再可用,索引列也將被忽略。

squeeze: boolean, default False

如果文件值包含一列,則返回一個(gè)Series

prefix: str, default None

在沒(méi)有列標(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.

使用的分析引擎??梢赃x擇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ù)(從文件開(kāi)始處算起),或需要跳過(guò)的行號(hào)列表(從0開(kāi)始)。

skipfooter : int, default 0

從文件尾部開(kāi)始忽略。 (c引擎不支持)

skip_footer : int, default 0

不推薦使用:建議使用skipfooter ,功能一樣。

nrows : int, default None

需要讀取的行數(shù)(從文件頭開(kāi)始算起)。

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ì)于大文件來(lái)說(shuō)數(shù)據(jù)集中沒(méi)有空值,設(shè)定na_filter=False可以提升讀取速度。

verbose : boolean, default False

是否打印各種解析器的輸出信息,例如:“非數(shù)值列中缺失值的數(shù)量”等。

skip_blank_lines : boolean, default True

如果為True,則跳過(guò)空行;否則記為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來(lái)做轉(zhuǎn)換。Pandas嘗試使用三種不同的方式解析,如果遇到問(wèn)題則使用下一種方式。

1.使用一個(gè)或者多個(gè)arrays(由parse_dates指定)作為參數(shù);

2.連接指定多列字符串作為一個(gè)列作為參數(shù);

3.每行調(diào)用一次date_parser函數(shù)來(lái)解析一個(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í)開(kāi)始和解釋的字符,引號(hào)內(nèi)的分割符將被忽略。

quoting : int or csv.QUOTE_* instance, default 0

控制csv中的引號(hào)常量??蛇x 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

如果沒(méi)有指定特定的語(yǔ)言,如果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?;蛘呤褂胐type 參數(shù)指定類型。注意使用chunksize 或者iterator 參數(shù)分塊讀入會(huì)將整個(gè)文件讀入到一個(gè)Dataframe,而忽略類型(只能在C解析器中有效)

如果整數(shù)列被壓縮(i.e. compact_ints=True),指定被壓縮的列是有符號(hào)還是無(wú)符號(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 文件讀寫(xiě)

讀取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)容打印出來(lá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文件讀寫(xiě)
    Excel文件一般使用制表符分隔列,可能存在多個(gè)工作表(sheet)。
    分別使用read_excel()和to_excel()讀寫(xiě),但注意需要設(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ù)可以通過(guò)字典索引方式得到。
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ù)值型??梢允褂胕nclude和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)算過(guò)程中自動(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()
  1. 使用同一個(gè)值填補(bǔ)
df.fillna(0)
  1. 使用前一個(gè)值(前向填補(bǔ))或后一個(gè)值(后向填補(bǔ)),設(shè)置method。
df.fillna(method='ffill') # pad,前向填補(bǔ)
df.fillna(method='bfill') # backfill,后向填補(bǔ)
  1. 不同列不同值填補(bǔ),輸入字典
df.fillna({'one':0,'three':1})
  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)過(guò)濾功能。
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(),首先通過(guò).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ǔ)》整理)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容