pandas統(tǒng)計分析
pandas主要包括兩個數(shù)據(jù)結(jié)構(gòu)全景,即Series對象和DataFrame對象狸涌,本章主要介紹如何導(dǎo)入外部數(shù)據(jù)、數(shù)據(jù)抽取瞄勾、以及數(shù)據(jù)的增加糊昙、修改辛掠、刪除,還包括數(shù)據(jù)清洗释牺、索引設(shè)置萝衩、數(shù)據(jù)排序與排名等,為后續(xù)數(shù)據(jù)處理和數(shù)據(jù)分析打下良好的基礎(chǔ)没咙。
pandas
pandas簡介
pandas是python的核心數(shù)據(jù)分析庫猩谊,能夠簡單、直觀祭刚、快速的處理各種類型的數(shù)據(jù)牌捷。
pandas能夠處理以下類型的數(shù)據(jù):
- 與SQL或Excel表類似的數(shù)據(jù)
- 有序和無序(非固定頻率)的時間序列數(shù)據(jù)
- 帶行、列標(biāo)簽的矩陣數(shù)據(jù)
- 任意其他形式的觀測袁梗、統(tǒng)計數(shù)據(jù)集
pandas優(yōu)勢:
- 能夠處理浮點與非浮點數(shù)據(jù)里的缺失數(shù)據(jù)宜鸯,表示為NaN
- 大小可變,可以插入或刪除DataFrame等多維對象的列遮怜。
- 自動淋袖、顯式數(shù)據(jù)對齊,顯式的將對象與一組標(biāo)簽對齊锯梁,也可以忽略標(biāo)簽即碗,在Series、DataFrame計算時自動與數(shù)據(jù)對齊
- 強大靈活的分組統(tǒng)計(groupby)功能陌凳,即數(shù)據(jù)聚合剥懒、轉(zhuǎn)換
- 可以將python和numpy數(shù)據(jù)機構(gòu)里不規(guī)則、不同索引的數(shù)據(jù)輕松的轉(zhuǎn)化為DataFrame對象
- 智能標(biāo)簽合敦,對大型數(shù)據(jù)集進行切片初橘、花式索引、子集分解等操作
- 直觀地合并(merge)充岛、連接(join)數(shù)據(jù)集
- 靈活的重塑(reshape)保檐、透視(pivot)數(shù)據(jù)集
- 成熟的導(dǎo)入、導(dǎo)出工具崔梗,導(dǎo)入導(dǎo)出各種格式文件夜只。
- 時間序列:支持日期范圍生成、頻率轉(zhuǎn)換蒜魄、移動窗口統(tǒng)計扔亥、移動窗口線性回歸场躯、日期位移等時間序列功能。
pandas安裝
1.常見可以使用pip工具安裝:
pip install Pandas
2.pycharm安裝
pycharm中點擊File→Settings旅挤,打開Settings窗口踢关,選擇Project Interpreter,然后單擊+按鈕谦铃,此時打開了Available Package窗口耘成,然后搜索需要添加的包名(此時是pandas),然后單擊install package即可安裝驹闰。
notice:有時需要解決依賴關(guān)系,在安裝pandas時還需要安裝xlrd撒会,xlwt庫來解決依賴關(guān)系嘹朗。
導(dǎo)入excel數(shù)據(jù)
首先導(dǎo)入模塊,然后導(dǎo)入相應(yīng)的文件名即可
import pandas as pd #導(dǎo)入pandas模塊
df = pd.read_excel('路徑文件名') #讀取excel文件
df1 = df.head() #前五條數(shù)據(jù)
df1 #顯示df1
在jupyter notebook中點擊運行上述代碼诵肛,即可顯示df1的數(shù)據(jù)屹培。
Series對象
Series是一維數(shù)據(jù),而DataFrame是帶標(biāo)簽的怔檩、大小可變的二維數(shù)據(jù)褪秀。
創(chuàng)建Series對象:
s= pd.Series(data,index = index)
參數(shù)說明:
- data:表示數(shù)據(jù),可以是字典薛训、多維數(shù)組媒吗、標(biāo)量
- index:行標(biāo)簽(索引)
- 返回值:Series對象
例:
import pandas as pd
s1 = pd.Series([88,60,75])
print(s1)
結(jié)果:
手動設(shè)置Series索引
import pandas as pd
s1 = pd.Series([88,60,75],index=[1,2,3])
s2 = pd.Series([88,60,75],index=['a','b','c'])
print(s1)
print(s2)
Series索引
Series位置索引
位置索引默認(rèn)是從0開始數(shù),[0]是Series的第一個數(shù)
import pandas as pd
s1 = pd.Series([88,60,75])
print(s1[0])
結(jié)果為88
Series標(biāo)簽索引
Series標(biāo)簽索引與位置索引類似乙埃,index的數(shù)據(jù)類型是字符串闸英,如果需要獲取多個標(biāo)簽值索引,需要用[[]]來表示介袜。
import pandas as pd
s2 = pd.Series([88,60,75],index=['a','b','c'])
print(s2['a'])
print(s2[['a','b']])
Series切片索引
用標(biāo)簽索引做切片甫何,包含索引開始的位置,也包含索引結(jié)束的位置遇伞。
用位置索引做切片辙喂,包含索引開始的位置,不包含索引結(jié)束的位置鸠珠。
s2 = pd.Series([88,60,75],index=['a','b','c'])
print(s2['a':'c'])
s2 = pd.Series([88,60,75],index=['a','b','c'])
print(s2[0:2])
獲取Series索引和值
獲取Series索引和值主要使用Series的index和values方法巍耗。
s2 = pd.Series([88,60,75])
print(s2.index)
print(s2.values)
DataFrame對象
DataFrame是一個二維表數(shù)據(jù)結(jié)構(gòu),由行跳芳、列數(shù)據(jù)組成的表格芍锦,既有行索引也有列索引。在DataFrame中飞盆,用index表示行或用columns表示列娄琉。
遍歷DataFrame數(shù)據(jù)次乓,輸出每一列數(shù)據(jù):
import pandas as pd
data = [[110,105,99],[105,88,115],[109,120,130]]
index = [0,1,2]
columns = ['a','b','c']
#創(chuàng)建DataFrame數(shù)據(jù)
df = pd.DataFrame(data = data,index=index,columns=columns)
print(df)
#遍歷DataFrame數(shù)據(jù)的每一列
for col in df.columns:
series = df[col]
print(series)
創(chuàng)建DataFrame對象
創(chuàng)建DataFrame對象主要使用pandas的DataFrame方法:
pandas.DataFrame(data,index,columns,dtype,copy)
參數(shù)說明:
- data:數(shù)據(jù),可以是ndarray數(shù)組孽水,Series對象票腰、列表、字典等
- index:行索引
- columns:列索引
- dtype:每一列的數(shù)據(jù)類型
- copy:用于復(fù)制數(shù)據(jù)
- 返回值:DataFrame
表1 數(shù)據(jù)類型對應(yīng)表
pandas dtype | python type |
---|---|
object | str |
int64 | int |
float64 | float |
bool | bool |
datetime64 | datetime64[ns] |
timedelta[ns] | NA |
category | NA |
使用二維數(shù)組創(chuàng)建DataFrame
import pandas as pd
#解決數(shù)據(jù)輸出時列名不對齊的問題
pd.set_option('display.unicode.east_asian_width',True)
data = [[110,105,99],[105,88,115],[109,120,130]]
columns = ['語文','數(shù)學(xué)','英語']
df = pd.DataFrame(data = data,columns=columns)
df
字典創(chuàng)建DataFrame
在使用字典創(chuàng)建DataFrame時女气,字典的value值只能是一維數(shù)組或單個的簡單數(shù)據(jù)類型杏慰,如果是數(shù)組,要求所有數(shù)組長度一致炼鞠,如果是單個數(shù)據(jù)缘滥,則每行都添加相同數(shù)據(jù)。
例:
import pandas as pd
#解決數(shù)據(jù)輸出時列名不對齊的問題
pd.set_option('display.unicode.east_asian_width',True)
df = pd.DataFrame({
'語文':[110,105,99],
'數(shù)學(xué)':[105,88,115],
'英語':[109,120,130],
'班級':'高一7班'
},index = [0,1,2])
df
DataFrame重要屬性和函數(shù)
表2 重要屬性
屬性 | 描述 | 舉例 |
---|---|---|
values | 查看所有元素的值 | df.values |
dtypes | 查看所有元素的類型 | df.dtypes |
index | 查看所有行名谒主、重命名行名 | df.index朝扼;df.index=[1,2,3] |
columns | 查看所有列名、重命名行名 | df.columns霎肯;df.columns= ['a','b','c'] |
T | 行列數(shù)據(jù)互換 | df.T |
head | 查看前n條數(shù)據(jù)擎颖,默認(rèn)5條 | df.head();df.head(10) |
tail | 查看后n條數(shù)據(jù),默認(rèn)5條 | df.tail()观游;df.tail(10) |
shape | 查看行數(shù)和列數(shù)搂捧,[0]表示行,[1]表示列 | df.shape() df.shape[1] |
info | 查看索引懂缕,數(shù)據(jù)類型和內(nèi)存信息 | df.info |
describe | 查看每列的統(tǒng)計匯總信息允跑,DataFrame類型 | df.describe() |
count | 返回每一列中的非空值的個數(shù) | df.count() |
sum | 返回每一列的和,無法計算返回空值 | df.sum() |
max | 返回每一列的最大值 | df.max() |
min | 返回每一列的最小值 | df.min() |
argmax | 返回最大值所在的自動索引的位置 | df.argmax() |
argmin | ||
idxmax | 返回最大值所在的自定義索引的位置 | df.idxmax |
idxmin | ||
mean | 返回每一列的平均值 | df.mean() |
median | 返回每一列的中位數(shù) | df.median() |
var | 返回每一列的方差 | |
std | 返回每一列的標(biāo)準(zhǔn)差 | |
isnull | 檢查df中的空值提佣,空值為True吮蛹,返回為布爾型數(shù)組 | |
notnull | 檢查df中的空值,空值為False |
導(dǎo)入外部數(shù)據(jù)
使用pandas的read_excel()方法導(dǎo)入.xls或.xlsx文件
語法如下:
pandas.read_excel(io,sheet_name=0,header=0,names=None,index_col=None,usecols=None,squeeze=False, dtype=None,engine=None,converters=None,true_values=None,false_values=None,skiprows=None,nrow=None, na_values=None,keep_default_na=True,verbose=False,parse_dates=False,date_parser=None,thousands=None, comment=None,skipfooter=0,conver_float=True,mangle_dupe_cols=True,**kwds)
參數(shù)說明:
- io:字符串拌屏,指文件路徑
- sheet_name:None潮针、字符串、整數(shù)倚喂、字符串列表或整數(shù)列表每篷,默認(rèn)值為0。字符串用于工作表名稱端圈,整數(shù)為索引表示工作表位置焦读,字符串列表或整數(shù)列表用于請求多個工作表,為None時獲取所有工作表舱权。
- header:指定作為列名的行矗晃,默認(rèn)為0,即第一行的值為列名若數(shù)據(jù)不包含列名宴倍,可以設(shè)置header = None
- names:默認(rèn)值為None张症,要使用的列名列表
- index_col:指定列位索引列仓技,默認(rèn)是None,索引0是DataFrame的行標(biāo)簽
- usecols:int俗他、list列表或字符串脖捻,默認(rèn)值是None
- squeeze:布爾值,默認(rèn)值是False兆衅,如果解析的數(shù)據(jù)只包含一列地沮,則返回一個Series
- dtype:列的數(shù)據(jù)類型名稱或字典,默認(rèn)值是None
- skiprows:省略指定行數(shù)的數(shù)據(jù)羡亩,從第一行開始
- skipfooter:省略指定行數(shù)的數(shù)據(jù)摩疑,從尾部數(shù)的行開始
導(dǎo)入excel
import pandas as pd
df= pd.read_excel('路徑文件名')
df1 = df.head() #輸出前五條數(shù)據(jù)
導(dǎo)入指定的sheet的頁
import pandas as pd
df= pd.read_excel('路徑文件名',sheet_name = '工作表名稱')
df1 = df.head() #輸出前五條數(shù)據(jù)
通過行、列索引導(dǎo)入指定行夕春、列數(shù)據(jù)
#指定行索引
import pandas as pd
df= pd.read_excel('路徑文件名',index_col = 0)#指定第一列為行索引
df1 = df.head() #輸出前五條數(shù)據(jù)
#指定列索引
import pandas as pd
df= pd.read_excel('路徑文件名',header = 1)#指定第一行為列索引
df1 = df.head() #輸出前五條數(shù)據(jù)
#指定列索引為數(shù)字
import pandas as pd
df= pd.read_excel('路徑文件名',header = None)#列索引為數(shù)字
df1 = df.head() #輸出前五條數(shù)據(jù)
導(dǎo)入指定列數(shù)據(jù)
#導(dǎo)入第一列數(shù)據(jù)
import pandas as pd
df= pd.read_excel('路徑文件名',usecols = [0])#導(dǎo)入第一列
df1 = df.head() #輸出前五條數(shù)據(jù)
#導(dǎo)入多列數(shù)據(jù)
import pandas as pd
df= pd.read_excel('路徑文件名',usecols = [0,3])#導(dǎo)入第一列和第四列
df1 = df.head() #輸出前五條數(shù)據(jù)
#導(dǎo)入指定列名稱
import pandas as pd
df= pd.read_excel('路徑文件名',usecols = ['a','b'])#導(dǎo)入第一列和第四列
df1 = df.head() #輸出前五條數(shù)據(jù)
導(dǎo)入.csv文件
pd.read_csv(filepath_or_buffer: Union[ForwardRef('PathLike[str]'), str, IO[~T], io.RawIOBase, io.BufferedIOBase, io.TextIOBase, _io.TextIOWrapper, mmap.mmap], sep=<object object at 0x000002897B8E6DF0>, 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, skipfooter=0, 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, cache_dates=True, iterator=False, chunksize=None, compression='infer', thousands=None, decimal: str = '.', lineterminator=None, quotechar='"', quoting=0, doublequote=True, escapechar=None, comment=None, encoding=None, dialect=None, error_bad_lines=True, warn_bad_lines=True, delim_whitespace=False, low_memory=True, memory_map=False, float_precision=None, storage_options: Optional[Dict[str, Any]] = None)
常用參數(shù):
- filepath_or_buffer:字符串未荒,文件路徑,也可以是URL鏈接
- sep及志、delimiter:字符串,分隔符
- header:指定作為列名的行寨腔,默認(rèn)為0速侈,即第一行的值為列名若數(shù)據(jù)不包含列名,可以設(shè)置header = None
- names:默認(rèn)值為None迫卢,要使用的列名列表
- index_col:指定列位索引列倚搬,默認(rèn)是None,索引0是DataFrame的行標(biāo)簽
- usecols:int乾蛤、list列表或字符串每界,默認(rèn)值是None
- dtype:列的數(shù)據(jù)類型名稱或字典,默認(rèn)值是None
- parse_dates:布爾類型值家卖、int類型值的列表眨层、列表或字典,默認(rèn)值為False
- encodding:字符串上荡,默認(rèn)為None趴樱,文件的編碼格式
- 返回值:返回一個DataFrame
import pandas as pd
df1 = pd.read_csv('路徑文件名',encoding = 'gbk') #導(dǎo)入.csv文件酪捡,并指定編碼格式
df1 = df1.head() #輸出前5條數(shù)據(jù)
導(dǎo)入.txt文本文件
導(dǎo)入.txt文件也是使用read_csv()方法叁征,只是修改sep參數(shù)為sep = '\t'
import pandas as pd
df1 = pd.read_csv('路徑文件名',sep = '\t',encoding = 'gbk')
df1 = df1.head()
df1#輸出前5條數(shù)據(jù)
導(dǎo)入HTML網(wǎng)頁
使用read_html()方法逛薇,主要用于導(dǎo)入帶有table標(biāo)簽的網(wǎng)頁表格數(shù)據(jù):
pd.read_html(io: Union[ForwardRef('PathLike[str]'), str, IO[~T], io.RawIOBase, io.BufferedIOBase, io.TextIOBase, _io.TextIOWrapper, mmap.mmap], match: Union[str, Pattern] = '.+', flavor: Optional[str] = None, header: Union[int, Sequence[int], NoneType] = None, index_col: Union[int, Sequence[int], NoneType] = None, skiprows: Union[int, Sequence[int], slice, NoneType] = None, attrs: Optional[Dict[str, str]] = None, parse_dates: bool = False, thousands: Optional[str] = ',', encoding: Optional[str] = None, decimal: str = '.', converters: Optional[Dict] = None, na_values=None, keep_default_na: bool = True, displayed_only: bool = True) -> List[pandas.core.frame.DataFrame]
常用參數(shù)說明:
- io:字符串捺疼,文件路徑,也可以是URL鏈接
- match:正則表達式永罚,返回與正則表達式匹配的表格
- flavor:解析器默認(rèn)為lxml
- header:指定列標(biāo)題所在的行啤呼,列表list為多重索引
- index_col:指定行標(biāo)題對應(yīng)的列卧秘,列表list為多重索引
- encoding:字符串,默認(rèn)為None媳友,文件的編碼格式
- 返回值:返回一個DataFrame斯议。
例:
import pandas as pd
df = pd.DataFrame()
url_list = ['http://www.espn.com/nba/salaries']
for i in range(2,13):
url = 'http://www.espn.com/nba/salaries/_/page/%s'%i
url_list.append(url)
#遍歷網(wǎng)頁中的table讀取網(wǎng)頁表格數(shù)據(jù)
for url in url_list:
df = df.append(pd.read_html(url),ignore_index = True)
#列表解析:遍歷DataFrame第3列,以子字符串$開頭
df = df[[x.startswith('$') for x in df[3]]]
df.to_csv('NBA.csv',header = ['RK','NAME','TEAM','SALARY'],index = False)#導(dǎo)出csv文件
最后得到一個csv文件:
3.5 數(shù)據(jù)抽取
在DataFrame中醇锚,主要使用loc屬性和iloc屬性抽取數(shù)據(jù)(即選取想要的部分?jǐn)?shù)據(jù))
兩者的區(qū)別:
- loc屬性:以列名和行名作為參數(shù)哼御,當(dāng)只有一個參數(shù)時,默認(rèn)是行名焊唬,即抽取整行數(shù)據(jù)恋昼,包括所有列
- iloc屬性:以行和列位置為索引(即0,1,2....)作為參數(shù),0表示第一行赶促,1表示第二行液肌。當(dāng)只有一個參數(shù)時,默認(rèn)是行索引鸥滨,即抽取整行數(shù)據(jù)嗦哆,包括所有列。
抽取一行數(shù)據(jù)
主要使用loc屬性
import pandas as pd
data = [[110,105,99],[105,88,115],[109,120,130],[112,115,110]]
name = ['a','b','c','d']
columns = ['語文','數(shù)學(xué)','英語']
df = pd.DataFrame(data = data,index = name,columns=columns)
df1 = df.loc['a']
df1
使用iloc抽取第一行數(shù)據(jù)婿滓,指定行索引即可
抽取多行數(shù)據(jù)
抽取任意多行數(shù)據(jù)
通過loc和iloc屬性指定行名和行索引即可實現(xiàn)抽取任意多行數(shù)據(jù)
抽取連續(xù)任意多行數(shù)據(jù)
在loc和iloc中合理的使用冒號(:)即可抽取連續(xù)任意多行數(shù)據(jù)
抽取指定列數(shù)據(jù)
#直接使用列名
import pandas as pd
data = [[110,105,99],[105,88,115],[109,120,130],[112,115,110]]
name = ['a','b','c','d']
columns = ['語文','數(shù)學(xué)','英語']
df = pd.DataFrame(data = data,index = name,columns=columns)
df1 = df[['語文','數(shù)學(xué)']]
df1
#使用loc屬性和iloc屬性
print(df.loc[:,['語文','數(shù)學(xué)']])#抽取語文和數(shù)學(xué)
print(df.iloc[:,[0,1]])#抽取第一列和第二列
按指定條件抽取數(shù)據(jù)
DataFrame對象實現(xiàn)數(shù)據(jù)查詢有以下三種方式:
- 取其中的一個元素
- 基于位置的查詢
- 基于行名老速、列名的查詢
例:
import pandas as pd
data = [[110,105,99],[105,88,115],[109,120,130],[112,115,110]]
name = ['a','b','c','d']
columns = ['語文','數(shù)學(xué)','英語']
df = pd.DataFrame(data = data,index = name,columns=columns)
df1 = df.loc[(df['語文']>105)&(df['數(shù)學(xué)']>88)]
df1
數(shù)據(jù)的增刪改查
增加
- 直接為DataFrame對象賦值
- 使用loc屬性在DataFrame對象的最后增加一列
- 在指定位置插入一列,使用pd.insert()方法
- 使用loc屬性增加一行數(shù)據(jù)
- 字典結(jié)合append方法來實現(xiàn)增加多行數(shù)據(jù)
例:
import pandas as pd
data = [[110,105,99],[105,88,115],[109,120,130],[112,115,110]]
name = ['a','b','c','d']
columns = ['語文','數(shù)學(xué)','英語']
df = pd.DataFrame(data = data,index = name,columns=columns)
#直接為DataFrame對象賦值
df['物理'] = [88,79,60,50]
#使用loc屬性在DataFrame對象的最后增加一列
df.loc[:,'物理']=[88,79,60,50]
#在指定位置插入一列凸主,使用pd.insert()方法
wl = [88,79,60,50]
df.insert(1,'物理',wl)
#使用loc屬性增加一行數(shù)據(jù)
df.['e']= [100,120,99]
#字典結(jié)合append方法來實現(xiàn)增加多行數(shù)據(jù)
df_insert = pd.DataFrame({'語文':[100,123,138],'數(shù)學(xué)':[99,142,60],'英語':[98,139,99]},index = ['e','f','g'])
df1 = df.append(df_insert)
修改
- 修改列標(biāo)題使用DataFrame中的columns屬性
- 修改行標(biāo)題使用DataFrame中的index屬性即可
- 修改數(shù)據(jù)主要使用DataFrame中的loc和iloc屬性
例:
df.columns = ['云紋','sdf','sd2']
df.index = list('1234')
df.rename({'a':1,'b':2,'c':d,axis = 0,inplace = True})
刪除
刪除數(shù)據(jù)主要使用drop方法
drop(labels=None, axis=0, index=None, columns=None, level=None, inplace=False, errors='raise')
主要參數(shù):
- labels:表示行標(biāo)簽或列標(biāo)簽
- axis:axis= 0橘券,表示按行刪除,axis = 1卿吐,表示按列刪除旁舰。默認(rèn)按行刪除
- index:刪除行
- columns:刪除列
- level針對有兩級索引的數(shù)據(jù)
- inplace:可選參數(shù),對原數(shù)組做出修改并返回一個新數(shù)組嗡官。如果值為True箭窜,則原數(shù)組直接被替換
- errors:參數(shù)值為ignore或raise,如果為ignore谨湘,則取消錯誤绽快。
刪除行、列數(shù)據(jù):
df.drop(['數(shù)學(xué)'],axis=1,inplace=True) #刪除某列
df.drop(columns='數(shù)學(xué)',inplace=True) #刪除columns為“數(shù)學(xué)”的列
df.drop(labels='數(shù)學(xué)', axis=1,inplace=True) #刪除列標(biāo)簽為“數(shù)學(xué)” 的列
df.drop(['明日','二月二'],inplace=True) #刪除某行
df.drop(index='明日',inplace=True) #刪除index為“明日”的行
df.drop(labels='明日', axis=0,inplace=True) #刪除行標(biāo)簽為“明日”的行
數(shù)據(jù)清洗
缺失值查看與處理
缺失值是由于某種原因?qū)е聰?shù)據(jù)為空紧阔,一般處理方式有不處理坊罢、刪除、填充/替換擅耽、插值(用均值/中位數(shù)/眾數(shù)等填補)活孩。
查看缺失值可以使用df.info()方法,然后通過查看各指標(biāo)非空數(shù)量是否一致乖仇。
通過isnull()方法和notnull()方法來判斷是否有缺失值
df.info()
df.isnull()
df.notnull()
缺失值刪除處理
在得知存在數(shù)據(jù)缺失情況后憾儒,可以使用dropna方法刪除含有缺失值的行
df1 = df.dropna()
有些數(shù)據(jù)雖然存在缺失值询兴,但是不影響數(shù)據(jù)分析,則可以使用以下代碼:
df2= df[df['字段'].notnull()]
重復(fù)值處理
對于數(shù)據(jù)中重復(fù)的行或者幾行中某幾列的值重復(fù)一般做刪除處理起趾,主要使用drop_duplicates()
#判斷一行數(shù)據(jù)是否重復(fù)(完全相同)诗舰,返回值為False表示沒有重復(fù),True表示重復(fù)
df1.duplicated()
#取出全部的重復(fù)數(shù)據(jù)
df1.drop_duplicates()
#去除指定列的重復(fù)數(shù)據(jù)
df1.drop_duplicates(['列名'])
#保留重復(fù)行中的最后一行
df1.drop_duplicates(['列名']训裆,keep = 'last')
#直接刪除眶根,保留一個副本
df1.drop_duplicates(['列名'],inplace = False)
#inplace = True表示直接在原來的DataFrame上刪除重復(fù)項,而默認(rèn)值false表示刪除重復(fù)項后生成一個副本边琉。
異常值的檢測與處理
異常值是指超出或低于正常范圍的值属百,檢測方法主要如下:
- 根據(jù)給定的范圍進行判斷,不在范圍內(nèi)的數(shù)據(jù)視為異常值
- 均方差:統(tǒng)計學(xué)中变姨,如果一個數(shù)據(jù)分布近似于正態(tài)分布族扰。
- 箱線圖:該圖是將數(shù)據(jù)通過四分位數(shù)的形式進行圖形化描述,超過上限或下限的數(shù)據(jù)都可以認(rèn)為是異常值定欧。
異常值常見處理方法如下:
- 刪除
- 將異常值當(dāng)做缺失值處理渔呵,以某個值填充
- 將異常值當(dāng)做特殊情況進行分析,研究異常值出現(xiàn)的原因砍鸠。
索引設(shè)置
索引的作用
索引能夠使我們快速找到所需的內(nèi)容厘肮,pandas索引的作用主要有:
方便查詢數(shù)據(jù)
-
使用索引可以提升查詢性能
- 如果索引是唯一的,pandas會使用哈希表優(yōu)化睦番,查找數(shù)據(jù)的時間復(fù)雜度為O(1)
- 如果索引不是惟一的,但是有序耍属,則pandas會使用二分查找算法托嚣,查找數(shù)據(jù)的時間復(fù)雜度為O(logN)
- 如果索引是完全隨機的,那么每次查詢都要掃描數(shù)據(jù)表厚骗,查找數(shù)據(jù)的時間復(fù)雜度為O(N)
自動的數(shù)據(jù)對齊功能
-
強大的數(shù)據(jù)結(jié)構(gòu)
- 基于分類數(shù)的索引示启,提升性能
- 多維索引,用于groupby多維聚合結(jié)果等
- 時間類型索引领舰,強大的日期和時間的方法支持夫嗓。
重新設(shè)置索引
使用reindex可以創(chuàng)建一個適應(yīng)新索引的新對象。
DataFrame.reindex(labels = None,index= None,columns = None,axis = None,method = None,copy = True,level = None,fill_value = nan,limit = None,tolerance = None)
常用參數(shù):
- labels:標(biāo)簽冲秽,可以是數(shù)組舍咖,默認(rèn)為None
- index:行索引
- columns:列索引
- axis:軸,axis = 0表示行锉桑,axis= 1 表示列
- method:默認(rèn)為None排霉,重新設(shè)置索引時,選擇插值(一種填充缺失數(shù)據(jù)的方法)方法民轴,其值可以是None攻柠,bfill/backfill(向后填充)球订、ffill/pad(向前填充)等。
- fill_value:缺失值要填充的數(shù)據(jù)瑰钮。如缺失值不用NaN填充冒滩,而用0填充,則設(shè)置fill_value = ()即可浪谴。
對Series對象重新設(shè)置索引
import pandas as pd
s1 = pd.Series([88,60,75],index = [1,2,3])
print(s1)
print(s1.reindex([1,2,3,4,5]))
如果不想用NaN填充數(shù)據(jù)开睡,則可以為fill_value參數(shù)指定值,如0
s1.reindex([1,2,3,4,5],fill_value= 0)
對DataFrame對象重新設(shè)置索引
也是使用reindex方法去設(shè)置较店,同時設(shè)置行士八、列索引時需要傳入?yún)?shù)index = ,columns
import pandas as pd
#解決數(shù)據(jù)輸出時列名不對齊的問題
pd.set_option('display.unicode.east_asian_width',True)
data= [[110,105,99],[105,88,115],[109,120,130]]
index = ['mr001','mr003','mr005']
columns = ['語文','數(shù)學(xué)','英語']
df = pd.DataFrame(data = data,index = index,columns = columns)
print(df)
#重新設(shè)置行索引
df.reindex(['mr001','mr002','mr003','mr004','mr005'])
#重新設(shè)置列索引
df.reindex(columns=['語文','物理','數(shù)學(xué)','英語'])
#重新設(shè)置行梁呈、列索引
df.reindex(index =['mr001','mr002','mr003','mr004','mr005'],columns=['語文','物理','數(shù)學(xué)','英語'])
設(shè)置某列為行索引
可以通過set_index方法設(shè)置某列作為行索引
df2 = df.set_index(['列名'])
數(shù)據(jù)清洗后重新設(shè)置連續(xù)的行索引
可以使用reset_index()方法設(shè)置
執(zhí)行以下代碼:
df2 = df.dropna().reset_index(drop = True)
數(shù)據(jù)排序與排名
數(shù)據(jù)排序
DataFrame數(shù)據(jù)排序主要使用sort_values()方法婚度,該方法類似于sql中的order by。
sort_values(by, axis=0, ascending=True, inplace=False, kind='quicksort', na_position='last', ignore_index=False, key: 'ValueKeyFunc' = None)
參數(shù)說明:
- by:要排序的名稱列表
- axis:軸官卡,0代表行蝗茁,1代表列,默認(rèn)是0
- ascending:升序或者降序寻咒,布爾值哮翘,指定多個排序就可以使用布爾值列表,默認(rèn)是True
- inplace:布爾值毛秘,默認(rèn)是False饭寺,如果值為True,則就地排序
- kind:指定排序算法叫挟,值為quicksort(快速排序)艰匙、mergesort(混合排序)或heapsort(堆排),默認(rèn)值為quicksort
- na_position:空值(NaN)的位置抹恳,值為first空值在數(shù)據(jù)開頭员凝,值為last空值在數(shù)據(jù)最后,默認(rèn)為last
- ignore_index:布爾值奋献,是否忽略索引健霹,值為True標(biāo)記索引(從0開始按順序的整數(shù)值),值為False則忽略索引瓶蚂。
排序:
- 按一列排序
- 按多列排序
- 對統(tǒng)計結(jié)果排序
- 按行排序
import pandas as pd
excel_file = 'mrbook.xlsx'
df = pd.DataFrame(pd.read_excel(excel_file))
df.head()
#按‘銷量’列降序排序
df = df.sort_values(by = '銷量',ascending=False)
df.head()
#按多列排序
df1 = df.sort_values(by =['圖書名稱','銷量'])
df1.head()
#對統(tǒng)計結(jié)果排序
df1 = df.groupby(['類別'])['銷量'].sum().reset_index()
df2 = df1.sort_values(by = '銷量',ascending=False)
df2.head()
#按行數(shù)據(jù) 排序
df = df.sort_values(by = 0,ascending = True,axis = 1)
df.head()
數(shù)據(jù)排名
排名是根據(jù)Series對象或DataFrame的某幾列的值進行排名糖埋,主要使用rank()方法
rank(axis=0, method: 'str' = 'average', numeric_only: 'Optional[bool_t]' = None, na_option: 'str' = 'keep', ascending: 'bool_t' = True, pct: 'bool_t' = False)
參數(shù)說明:
axis:軸,axis=0表示行扬跋,axis = 1表示列阶捆,默認(rèn)為0,即按行排序
-
method:表示在具有相同值的情況下所使用的排序方法。設(shè)置值如下:
- average:默認(rèn)值洒试,平均排名
- min:最小值排名
- max:最大值排名
- first:按值在原始數(shù)據(jù)中的出現(xiàn)順序分配排名
- dense:密集排名倍奢,類似最小值排名,但是排名每次只增加1垒棋,即排名相同的數(shù)據(jù)只占一個名次
numeric_only:對于DataFrame對象卒煞,如果設(shè)置值為True,則只對數(shù)字列進行排序叼架。
-
na_option:空值的排序方式畔裕,設(shè)置值如下。
- keep:保留乖订,將空值等級賦給NaN的值
- top:如果按升序排序扮饶,則將最小排名賦值給NaN值
- bottom:如果按升序排序,則將最大排名賦值給NaN的值乍构。
ascending:升序或降序排序甜无,布爾值,指定多個排序可以使用布爾值列表
pct:布爾值哥遮,是否以百分比形式返回排名岂丘,默認(rèn)值為False
順序排名
import pandas as pd
excel_file = 'mrbook.xlsx'
df = pd.DataFrame(pd.read_excel(excel_file))
#按‘銷量’列降序排序
df = df.sort_values(by = '銷量',ascending= False)
#順序排名
df['順序排名'] = df['銷量'].rank(method = 'first',ascending=False)
df1 = df[['圖書名稱','銷量','順序排名']]
print(df1)
平均排名
#平均排名
df['平均排名'] = df['銷量'].rank(ascending=False)
df1 = df[['圖書名稱','銷量','平均排名']]
print(df1)
最小值排名
#最小值排名:排名相同的,按順序排名取最小值為排名
df['最小值排名'] = df['銷量'].rank(method = 'min',ascending=False)
df1 = df[['圖書名稱','銷量','最小值排名']]
print(df1)
最大值排名
#最大值排名:排名相同的眠饮,按順序排名取最大值為排名
df['最大值排名'] = df['銷量'].rank(method = 'max',ascending=False)
df1 = df[['圖書名稱','銷量','最大值排名']]
print(df1)
notice:以上部分代碼示例引用自《Python數(shù)據(jù)分析從入門到精通》 (2021年清華大學(xué)出版社出版的圖書)奥帘,如有侵權(quán),請聯(lián)系刪除