pandas統(tǒng)計分析(上)

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é)果:


圖片.png

手動設(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)
圖片.png

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']])
圖片.png

Series切片索引

用標(biāo)簽索引做切片甫何,包含索引開始的位置,也包含索引結(jié)束的位置遇伞。

用位置索引做切片辙喂,包含索引開始的位置,不包含索引結(jié)束的位置鸠珠。

s2 = pd.Series([88,60,75],index=['a','b','c'])
print(s2['a':'c'])
圖片.png
s2 = pd.Series([88,60,75],index=['a','b','c'])
print(s2[0:2])
圖片.png

獲取Series索引和值

獲取Series索引和值主要使用Series的index和values方法巍耗。

s2 = pd.Series([88,60,75])
print(s2.index)
print(s2.values)
圖片.png

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)
圖片.png

創(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
圖片.png

字典創(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
圖片.png

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文件:

圖片.png

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
圖片.png

使用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]])#抽取第一列和第二列
圖片.png
圖片.png

按指定條件抽取數(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
圖片.png

數(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]))
圖片.png

如果不想用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()
圖片.png
#按多列排序
df1 = df.sort_values(by  =['圖書名稱','銷量'])
df1.head()
圖片.png
#對統(tǒng)計結(jié)果排序
df1 = df.groupby(['類別'])['銷量'].sum().reset_index()
df2 = df1.sort_values(by = '銷量',ascending=False)
df2.head()
圖片.png
#按行數(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)
圖片.png

平均排名

#平均排名
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)系刪除

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末仪召,一起剝皮案震驚了整個濱河市寨蹋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌扔茅,老刑警劉巖钥庇,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異咖摹,居然都是意外死亡,警方通過查閱死者的電腦和手機难述,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進店門萤晴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人胁后,你說我怎么就攤上這事店读。” “怎么了攀芯?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵屯断,是天一觀的道長。 經(jīng)常有香客問我,道長殖演,這世上最難降的妖魔是什么氧秘? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮趴久,結(jié)果婚禮上丸相,老公的妹妹穿的比我還像新娘。我一直安慰自己彼棍,他們只是感情好灭忠,可當(dāng)我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著座硕,像睡著了一般弛作。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上华匾,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天映琳,我揣著相機與錄音,去河邊找鬼瘦真。 笑死刊头,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的诸尽。 我是一名探鬼主播原杂,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼您机!你這毒婦竟也來了穿肄?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤际看,失蹤者是張志新(化名)和其女友劉穎咸产,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體仲闽,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡脑溢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了赖欣。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片屑彻。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖顶吮,靈堂內(nèi)的尸體忽然破棺而出社牲,到底是詐尸還是另有隱情,我是刑警寧澤悴了,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布搏恤,位于F島的核電站违寿,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏熟空。R本人自食惡果不足惜藤巢,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望痛阻。 院中可真熱鬧菌瘪,春花似錦、人聲如沸阱当。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽弊添。三九已至录淡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間油坝,已是汗流浹背嫉戚。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留澈圈,地道東北人彬檀。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像瞬女,于是被迫代替她去往敵國和親窍帝。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,884評論 2 354

推薦閱讀更多精彩內(nèi)容