在數(shù)據(jù)分析工作中,Pandas 的使用頻率是很高的,一方面是因?yàn)?Pandas 提供的基礎(chǔ)數(shù)據(jù)結(jié)構(gòu) DataFrame 與 json 的契合度很高,轉(zhuǎn)換起來就很方便。
另一方面,如果我們?nèi)粘5臄?shù)據(jù)清理工作不是很復(fù)雜的話,你通常用幾句 Pandas 代碼就可以對(duì)數(shù)據(jù)進(jìn)行規(guī)整。
Pandas 可以說是基于 NumPy 構(gòu)建的含有更高級(jí)數(shù)據(jù)結(jié)構(gòu)和分析能力的工具包。在 NumPy 中數(shù)據(jù)結(jié)構(gòu)是圍繞 ndarray 展開的,那么在 Pandas 中的核心數(shù)據(jù)結(jié)構(gòu)是什么呢?
下面主要給你講下Series 和 DataFrame 這兩個(gè)核心數(shù)據(jù)結(jié)構(gòu),他們分別代表著一維的序列和二維的表結(jié)構(gòu)。基于這兩種數(shù)據(jù)結(jié)構(gòu),Pandas 可以對(duì)數(shù)據(jù)進(jìn)行導(dǎo)入、清洗、處理、統(tǒng)計(jì)和輸出。
數(shù)據(jù)結(jié)構(gòu)Series 和 Dataframe
Series
Series 是個(gè)定長的字典序列。說是定長是因?yàn)樵诖鎯?chǔ)的時(shí)候,相當(dāng)于兩個(gè) ndarray,這也是和字典結(jié)構(gòu)最大的不同。因?yàn)樵谧值涞慕Y(jié)構(gòu)里,元素的個(gè)數(shù)是不固定的。
Series 的兩個(gè)基本屬性有兩個(gè)基本屬性:index 和 values。在 Series 結(jié)構(gòu)中,index 默認(rèn)是 0,1,2,……遞增的整數(shù)序列,當(dāng)然我們也可以自己來指定索引,比如 index=[‘a(chǎn)’, ‘b’, ‘c’, ‘d’]。
例子:
import pandas as pd
from pandas import Series, DataFrame
x1 = Series([1,2,3,4])
x2 = Series(data=[1,2,3,4], index=['a', 'b', 'c', 'd'])
print (x1)
print (x2)
運(yùn)行結(jié)果:
10 1
21 2
32 3
43 4
5dtype: int64
6a 1
7b 2
8c 3
9d 4
10dtype: int64
這個(gè)例子中,x1 中的 index 采用的是默認(rèn)值,x2 中 index 進(jìn)行了指定。我們也可以采用字典的方式來創(chuàng)建 Series,比如:
例子:
d = {'a':1, 'b':2, 'c':3, 'd':4}
2x3 = Series(d)3print (x3 )
運(yùn)行結(jié)果:
1a 1
2b 2
3c 3
4d 4
5dtype: int64
DataFrame
DataFrame 類型數(shù)據(jù)結(jié)構(gòu)類似數(shù)據(jù)庫表。
它包括了行索引和列索引,我們可以將 DataFrame 看成是由相同索引的 Series 組成的字典類型。
我們虛構(gòu)一個(gè)考試的場景,想要輸出幾位英雄的考試成績:
import pandas as pd
from pandas import Series, DataFrame
data = {'Chinese': [66, 95, 93, 90,80],'English': [65, 85, 92, 88, 90],'Math': [30, 98, 96, 77, 90]}
df1= DataFrame(data)
df2 = DataFrame(data, index=['ZhangFei', 'GuanYu', 'ZhaoYun', 'HuangZhong', 'DianWei'], columns=['English', 'Math', 'Chinese'])
print (df1)
print (df2)
在后面的案例中,我一般會(huì)用 df, df1, df2 這些作為 DataFrame 數(shù)據(jù)類型的變量名,我們以例子中的 df2 為例,
列索引是 [‘English’, ‘Math’, ‘Chinese’],行索引是 [‘ZhangFei’, ‘GuanYu’, ‘ZhaoYun’, ‘HuangZhong’, ‘DianWei’],所以 df2 的輸出是:
English Math Chinese
ZhangFei 65 30 66
GuanYu 85 98 95
ZhaoYun 92 96 93
HuangZhong 88 77 90
DianWei 90 90 80
在了解了 Series 和 DataFrame 這兩個(gè)數(shù)據(jù)結(jié)構(gòu)后,我們就從數(shù)據(jù)處理的流程角度,來看下他們的使用方法。
Pandas 允許直接從 xlsx,csv 等文件中導(dǎo)入數(shù)據(jù),也可以輸出到 xlsx, csv 等文件,非常方便。
import pandas as pd
from pandas import Series, DataFrame
score = DataFrame(pd.read_excel('data.xlsx'))
score.to_excel('data1.xlsx')
print (score)
需要說明的是,在運(yùn)行的過程可能會(huì)存在缺少 xlrd 和 openpyxl 包的情況,到時(shí)候如果缺少了,可以在命令行模式下使用“pip install”命令來進(jìn)行安裝。
數(shù)據(jù)清洗
數(shù)據(jù)清洗是數(shù)據(jù)準(zhǔn)備過程中必不可少的環(huán)節(jié),Pandas 也為我們提供了數(shù)據(jù)清洗的工具,在后面數(shù)據(jù)清洗的章節(jié)中會(huì)給你做詳細(xì)的介紹,這里簡單介紹下 Pandas 在數(shù)據(jù)清洗中的使用方法。
還是以上面這些英雄人物的數(shù)據(jù)為例。
data = {'Chinese': [66, 95, 93, 90,80],'English': [65, 85, 92, 88, 90],'Math': [30, 98, 96, 77, 90]}
df2 = DataFrame(data, index=['ZhangFei', 'GuanYu', 'ZhaoYun', 'HuangZhong', 'DianWei'], columns=['English', 'Math', 'Chinese'])
在數(shù)據(jù)清洗過程中,一般都會(huì)遇到以下這幾種情況,下面我來簡單介紹一下。
1. 刪除 DataFrame 中的不必要的列或行:
Pandas 提供了一個(gè)便捷的方法 drop() 函數(shù)來刪除我們不想要的列或行。比如我們想把“語文”這列刪掉。
df2 = df2.drop(columns=['Chinese'])
想把“張飛”這行刪掉。
df2 = df2.drop(index=['ZhangFei'])
2. 重命名列名 columns,讓列表名更容易識(shí)別:
如果你想對(duì) DataFrame 中的 columns 進(jìn)行重命名,可以直接使用 rename(columns=new_names, inplace=True) 函數(shù),比如我把列名 Chinese 改成 YuWen,English 改成 YingYu。
# inplace:刷選過缺失值得新數(shù)據(jù)是存為副本還是直接在原數(shù)據(jù)上進(jìn)行修改。
df2.rename(columns={'Chinese': 'YuWen', 'English': 'Yingyu'}, inplace = True)
3. 去重復(fù)的值:
數(shù)據(jù)采集可能存在重復(fù)的行,這時(shí)只要使用 drop_duplicates() 就會(huì)自動(dòng)把重復(fù)的行去掉。
df = df.drop_duplicates() # 去除重復(fù)行
4. 格式問題:
這是個(gè)比較常用的操作,因?yàn)楹芏鄷r(shí)候數(shù)據(jù)格式不規(guī)范,我們可以使用 astype 函數(shù)來規(guī)范數(shù)據(jù)格式,比如我們把 Chinese 字段的值改成 str 類型,或者 int64 可以這么寫:
df2['Chinese'].astype('str')
df2['Chinese'].astype(np.int64)
數(shù)據(jù)間的空格
有時(shí)候我們先把格式轉(zhuǎn)成了 str 類型,是為了方便對(duì)數(shù)據(jù)進(jìn)行操作,這時(shí)想要?jiǎng)h除數(shù)據(jù)間的空格,我們就可以使用 strip 函數(shù):
# 刪除左右兩邊空格
df2['Chinese']=df2['Chinese'].map(str.strip)
# 刪除左邊空格
df2['Chinese']=df2['Chinese'].map(str.lstrip)
# 刪除右邊空格
df2['Chinese']=df2['Chinese'].map(str.rstrip)
如果數(shù)據(jù)里有某個(gè)特殊的符號(hào),我們想要?jiǎng)h除怎么辦?同樣可以使用 strip 函數(shù),比如 Chinese 字段里有美元符號(hào),我們想把這個(gè)刪掉,可以這么寫:
df2['Chinese']=df2['Chinese'].str.strip('$')
大小寫轉(zhuǎn)換:
大小寫是個(gè)比較常見的操作,比如人名、城市名等的統(tǒng)一都可能用到大小寫的轉(zhuǎn)換,在 Python 里直接使用 upper(), lower(), title() 函數(shù),方法如下:
# 全部大寫
df2.columns = df2.columns.str.upper()
# 全部小寫
df2.columns = df2.columns.str.lower()
# 首字母大寫
df2.columns = df2.columns.str.title()
查找空值:
數(shù)據(jù)量大的情況下,有些字段存在空值 NaN 的可能,這時(shí)就需要使用 Pandas 中的 isnull 函數(shù)進(jìn)行查找。比如,我們輸入一個(gè)數(shù)據(jù)表如下:
姓名 語文 英語 數(shù)學(xué)
張飛 66 65
關(guān)羽 95 85 98
趙云 95 92 96
黃忠 90 88 77
典韋 80 90 90
如果我們想看下哪個(gè)地方存在空值 NaN,可以針對(duì)數(shù)據(jù)表 df進(jìn)行df.isnull():結(jié)果如下
姓名 語文 英語 數(shù)學(xué)
0 False False False True
1 False False False False
2 False False False False
3 False False False False
4 False False False False
如果我想知道哪列存在空值,可以使用 df.isnull().any(),結(jié)果如下:
姓名 False
語文 False
英語 False
數(shù)學(xué) True
使用 apply 函數(shù)對(duì)數(shù)據(jù)進(jìn)行清洗
apply 函數(shù)是 Pandas 中自由度非常高的函數(shù),使用頻率也非常高。
比如我們想對(duì) name 列的數(shù)值都進(jìn)行大寫轉(zhuǎn)化可以用:
df['name'] = df['name'].apply(str.upper)
我們也可以定義個(gè)函數(shù),在 apply 中進(jìn)行使用。比如定義 double_df 函數(shù)是將原來的數(shù)值 *2 進(jìn)行返回。然后對(duì) df1 中的“語文”列的數(shù)值進(jìn)行 *2 處理,可以寫成:
def double_df(x):
return 2*x
df1[u'語文'] = df1[u'語文'].apply(double_df)
我們也可以定義更復(fù)雜的函數(shù),比如對(duì)于 DataFrame,我們新增兩列,其中’new1’列是“語文”和“英語”成績之和的 m 倍,'new2’列是“語文”和“英語”成績之和的 n 倍,我們可以這樣寫:
def plus(df,n,m):
df['new1'] = (df[u'語文']+df[u'英語']) * m
df['new2'] = (df[u'語文']+df[u'英語']) * n
return df
df1 = df1.apply(plus,axis=1,args=(2,3,))
其中 axis=1 代表按照列為軸進(jìn)行操作,axis=0 代表按照行為軸進(jìn)行操作,args 是傳遞的兩個(gè)參數(shù),即 n=2, m=3,在 plus 函數(shù)中使用到了 n 和 m,從而生成新的 df。
自定義函數(shù)apply
def search_hundredth(train_content):
hundredth=train_content.loc[99]
return hundredth
search_func=train_content.apply(search_hundredth)
print(search_func)
數(shù)據(jù)統(tǒng)計(jì)
在數(shù)據(jù)清洗后,我們就要對(duì)數(shù)據(jù)進(jìn)行統(tǒng)計(jì)了。Pandas 和 NumPy 一樣,都有常用的統(tǒng)計(jì)函數(shù),如果遇到空值 NaN,會(huì)自動(dòng)排除。
常用的統(tǒng)計(jì)函數(shù)包括:
count() 統(tǒng)計(jì)個(gè)數(shù),空值NaN不計(jì)算
describe() 一次性輸出多個(gè)統(tǒng)計(jì)指標(biāo),包括:count,mean,std,min,max 等
min() 最小值
max() 最大值
sum() 總和
mean() 平均值
median() 中位數(shù)
var() 方差
std() 標(biāo)準(zhǔn)差
argmin() 統(tǒng)計(jì)最小值的索引位置
argmax() 統(tǒng)計(jì)最大值的索引位置
idxmin() 統(tǒng)計(jì)最小值的索引值
idxmax() 統(tǒng)計(jì)最大值的索引值
表格中有一個(gè) describe() 函數(shù),統(tǒng)計(jì)函數(shù)千千萬,describe() 函數(shù)最簡便。它是個(gè)統(tǒng)計(jì)大禮包,可以快速讓我們對(duì)數(shù)據(jù)有個(gè)全面的了解。下面我直接使用 df1.descirbe() 輸出結(jié)果為:
df1 = DataFrame({'name':['ZhangFei', 'GuanYu', 'a', 'b', 'c'], 'data1':range(5)})
print df1.describe()
運(yùn)行結(jié)果:
Image text
數(shù)據(jù)表合并
有時(shí)候我們需要將多個(gè)渠道源的多個(gè)數(shù)據(jù)表進(jìn)行合并,一個(gè) DataFrame 相當(dāng)于一個(gè)數(shù)據(jù)庫的數(shù)據(jù)表,那么多個(gè) DataFrame 數(shù)據(jù)表的合并就相當(dāng)于多個(gè)數(shù)據(jù)庫的表合并。
比如我要?jiǎng)?chuàng)建兩個(gè) DataFrame:
df1 = DataFrame({'name':['ZhangFei', 'GuanYu', 'a', 'b', 'c'], 'data1':range(5)})
df2 = DataFrame({'name':['ZhangFei', 'GuanYu', 'A', 'B', 'C'], 'data2':range(5)})
1. 基于指定列進(jìn)行連接
比如我們可以基于 name 這列進(jìn)行連接。
`df3 = pd.merge(df1, df2, on='name')`
運(yùn)行結(jié)果:
2. inner 內(nèi)連接
inner 內(nèi)鏈接是 merge 合并的默認(rèn)情況,inner 內(nèi)連接其實(shí)也就是鍵的交集,在這里 df1, df2 相同的鍵是 name,所以是基于 name 字段做的連接:
`df3 = pd.merge(df1, df2, how='inner')`
運(yùn)行結(jié)果:
3. left 左連接
左連接是以第一個(gè) DataFrame 為主進(jìn)行的連接,第二個(gè) DataFrame 作為補(bǔ)充。
`df3 = pd.merge(df1, df2, how='left')`
運(yùn)行結(jié)果:
4. right 右連接
右連接是以第二個(gè) DataFrame 為主進(jìn)行的連接,第一個(gè) DataFrame 作為補(bǔ)充。
`df3 = pd.merge(df1, df2, how='right')`
運(yùn)行結(jié)果:
5. outer 外連接
外連接相當(dāng)于求兩個(gè) DataFrame 的并集。
df3 = pd.merge(df1, df2, how='outer')
運(yùn)行結(jié)果:
如何用 SQL 方式打開 Pandas
Pandas 的 DataFrame 數(shù)據(jù)類型可以讓我們像處理數(shù)據(jù)表一樣進(jìn)行操作,比如數(shù)據(jù)表的增刪改查,都可以用 Pandas 工具來完成。
不過也會(huì)有很多人記不住這些 Pandas 的命令,相比之下還是用 SQL 語句更熟練,用 SQL 對(duì)數(shù)據(jù)表進(jìn)行操作是最方便的,它的語句描述形式更接近我們的自然語言。
事實(shí)上,在 Python 里可以直接使用 SQL 語句來操作 Pandas。
這里給你介紹個(gè)工具:pandasql
pandasql 中的主要函數(shù)是 sqldf,它接收兩個(gè)參數(shù):一個(gè) SQL 查詢語句,還有一組環(huán)境變量 globals() 或 locals()。這樣我們就可以在 Python 里,直接用 SQL 語句中對(duì) DataFrame 進(jìn)行操作,舉個(gè)例子:import pandas as pd
例子:
from pandas import DataFrame
from pandasql import sqldf, load_meat, load_births
df1 = DataFrame({'name':['ZhangFei', 'GuanYu', 'a', 'b', 'c'], 'data1':range(5)})
pysqldf = lambda sql: sqldf(sql, globals())
sql = "select * from df1 where name ='ZhangFei'"
print pysqldf(sql)
運(yùn)行結(jié)果:
data1 name
0 0 ZhangFei
上面這個(gè)例子中,我們是對(duì)“name='ZhangFei”“的行進(jìn)行了輸出。當(dāng)然你會(huì)看到我們用到了 lambda,lambda 在 python 中算是使用頻率很高的,那 lambda 是用來做什么的呢?
它實(shí)際上是用來定義一個(gè)匿名函數(shù)的,具體的使用形式為:
lambda argument_list: expression
這里 argument_list 是參數(shù)列表,expression 是關(guān)于參數(shù)的表達(dá)式,會(huì)根據(jù) expression 表達(dá)式計(jì)算結(jié)果進(jìn)行輸出返回。
在上面的代碼中,我們定義了:
pysqldf = lambda sql: sqldf(sql, globals())
在這個(gè)例子里,輸入的參數(shù)是 sql,返回的結(jié)果是 sqldf 對(duì) sql 的運(yùn)行結(jié)果,當(dāng)然 sqldf 中也輸入了 globals 全局參數(shù),因?yàn)樵?sql 中有對(duì)全局參數(shù) df1 的使用。
讀取文件里的內(nèi)容
以csv的格式讀取文件里的內(nèi)容
train_content=pd.read_csv("train.csv")
顯示pd_content的前面三行(不包括列名字)
print(train_content.head(3)
pivot_table函數(shù)
pivot_table有四個(gè)最重要的參數(shù)index
、values
、columns
、aggfunc
index index代表索引,每個(gè)pivot_table必須擁有一個(gè)index。
Values Values可以對(duì)需要的計(jì)算數(shù)據(jù)進(jìn)行篩選
Aggfunc aggfunc參數(shù)可以設(shè)置我們對(duì)數(shù)據(jù)聚合時(shí)進(jìn)行的函數(shù)操作。當(dāng)我們未設(shè)置aggfunc時(shí),它默認(rèn)aggfunc='mean'計(jì)算均值,可以設(shè)置多個(gè) 如: [aggfunc=[np.sum,np.mean]] 此時(shí)會(huì)顯示np.sum和np.mean統(tǒng)計(jì)出來的數(shù)據(jù)。
Columns Columns類似Index可以設(shè)置列層次字段,它不是一個(gè)必要參數(shù),作為一種分割數(shù)據(jù)的可選方式。
#以 Pclass(船艙)為索引 查看不同船艙人員的平均存活率Survived。
train_survived=train_content.pivot_table(index="Pclass",values="Survived")
# 查看不同船艙的收費(fèi)均值是多少
train_age_fare=train_content.pivot_table(index="Pclass",values=["Age","Fare"])
# 查看不同船艙人員的的人均年齡
train_survived=train_content.pivot_table(index="Pclass",values="Age")
icol和col 取范圍
iloc和loc的區(qū)別是 iloc只能跟整數(shù),而loc可以跟數(shù)字
print(train_content.iloc[83,3]) #找的是除title以外的第84行,因?yàn)閿?shù)組默認(rèn)是從0開始向上增長的
print(train_content.iloc[82:83,3:5]) #去尾的83不包括 5不包括
print(train_content.iloc[82:84,3:6]) #去尾的83不包括 5不包括
print(train_content.loc[83,"Age"])
print(train_content.loc[82:83,"Name":"Age"]) #還可以跟范圍
將Pandas中的DataFrame類型轉(zhuǎn)換成Numpy中array類型的三種方法
dataframe 轉(zhuǎn)列表
1、使用DataFrame中的values方法
df.values
2、使用DataFrame中的as_matrix()方法
df.as_matrix()
3、使用Numpy中的array方法
np.array(df)
pandas.DataFrame.fillna 用指定的方法填充NA/NaN
DataFrame.fillna(value = None,method = None,axis = None,inplace = False,limit = None,downcast = None,** kwargs )
value
:標(biāo)量,字典,系列或DataFrame用于填充孔的值(例如0),或者用于指定每個(gè)索引(對(duì)于Series)或列(對(duì)于DataFrame)使用哪個(gè)值的Dict /Series / DataFrame。(不會(huì)填寫dict / Series / DataFrame中的值)。該值不能是列表。method
: {'backfill','bfill','pad','ffill',None},默認(rèn)無 用于填充重新索引的填充孔的方法系列填充/填充axis
: {0或'索引',1或'列'}
例子:
>>> df = pd.DataFrame([[np.nan, 2, np.nan, 0],
... [3, 4, np.nan, 1],
... [np.nan, np.nan, np.nan, 5],
... [np.nan, 3, np.nan, 4]],
... columns=list('ABCD'))
>>> df
A B C D
0 NaN 2.0 NaN 0
1 3.0 4.0 NaN 1
2 NaN NaN NaN 5
3 NaN 3.0 NaN 4
用0替換所有NaN元素
>>> df.fillna(0)
A B C D
0 0.0 2.0 0.0 0
1 3.0 4.0 0.0 1
2 0.0 0.0 0.0 5
3 0.0 3.0 0.0 4
我們還可以向前或向后傳播非空值。
>>> df.fillna(method='ffill')
A B C D
0 NaN 2.0 NaN 0
1 3.0 4.0 NaN 152 3.0 4.0 NaN 5
3 3.0 3.0 NaN 4
將“A”,“B”,“C”和“D”列中的所有NaN元素分別替換為0,1,2和3。
>>> values = {'A': 0, 'B': 1, 'C': 2, 'D': 3}
>>> df.fillna(value=values)
A B C D
0 0.0 2.0 2.0 0
1 3.0 4.0 2.0 1
2 0.0 1.0 2.0 5
3 0.0 3.0 2.0 4
只替換第一個(gè)NaN元素。
>>> df.fillna(value=values, limit=1)
A B C D
0 0.0 2.0 2.0 0
1 3.0 4.0 NaN 1
2 NaN 1.0 NaN 5
3 NaN 3.0 NaN 4
pandas.DataFrame.groupby
groupby操作涉及拆分對(duì)象,應(yīng)用函數(shù)和組合結(jié)果的某種組合。這可用于對(duì)這些組上的大量數(shù)據(jù)和計(jì)算操作進(jìn)行分組。
例子:指定以什么為組執(zhí)行操作
>>> df = pd.DataFrame({'Animal' : ['Falcon', 'Falcon',
'Parrot', 'Parrot'],
. 'Max Speed' : [380., 370., 24., 26.]})
>>> df
Animal Max Speed
0 Falcon 380.0
1 Falcon 370.0
2 Parrot 24.0
3 Parrot 26.0
>>> df.groupby(['Animal']).mean()
Max Speed
Animal
Falcon 375.0
Parrot 25.0
例子2:可以指定顯示的內(nèi)容
print(train_data.groupby(['Pclass'])['Pclass','Survived'].mean())
Pclass Survived
Pclass
1 1.0 0.629630
2 2.0 0.472826
3 3.0 0.242363
print(train_data.groupby(['Pclass'])['Pclass','Survived','Age'].mean())
Pclass Survived Age
Pclass
1.0 0.629630 37.048118
2.0 0.472826 29.866958
3.0 0.242363 26.40325
分層索引
我們可以使用level參數(shù)對(duì)不同級(jí)別的層次索引進(jìn)行分組:
>>> arrays = [['Falcon', 'Falcon', 'Parrot', 'Parrot'],
... ['Capitve', 'Wild', 'Capitve', 'Wild']]
>>> index = pd.MultiIndex.from_arrays(arrays, names=('Animal', 'Type'))
>>> df = pd.DataFrame({'Max Speed' : [390., 350., 30., 20.]},
... index=index)
>>> df
Max Speed
Animal Type1Falcon Capitve 390.0
Wild 350.0
Parrot Capitve 30.0
Wild 20.0
>> df.groupby(level=0).mean()
Max Speed
Animal
Falcon 370.0
Parrot 25.0
>>> df.groupby(level=1).mean()
Max Speed
Type
Capitve 210.0
Wild 185.0
pandas按若干個(gè)列的組合條件篩選數(shù)據(jù)
取年齡等于26,并且存活的數(shù)據(jù)的數(shù)量
print(train_data[(train_data['Age']==29) & (train_data['Survived']==1)].count())
pandas.Series.map
根據(jù)輸入的對(duì)應(yīng)關(guān)系映射系列的值。
用于將系列中的每個(gè)值替換為另一個(gè)值,該值可以從函數(shù),a dict或a 派生Series。
例子:
>>> s = pd.Series(['cat', 'dog', np.nan, 'rabbit'])
>>> s
0 cat
1 dog
2 NaN
3 rabbit
dtype: object
map接受a dict或a Series。除非dict具有默認(rèn)值(例如),否則將dict轉(zhuǎn)換為未找到的NaN值defaultdict:
>>> s.map({'cat': 'kitten', 'dog': 'puppy'})
0 kitten
1 puppy
2 NaN
3 NaN
dtype: object
它還接受一個(gè)功能:
>>> s.map('I am a {}'.format)
0 I am a cat
1 I am a dog
2 I am a nan
3 I am a rabbit
dtype: object
為避免將函數(shù)應(yīng)用于缺失值(并將其保留為 NaN),na_action='ignore'可以使用:
>>> s.map('I am a {}'.format, na_action='ignore')
0 I am a cat
1 I am a dog
2 NaN
3 I am a rabbit
dtype: object
pandas.set_option
可以設(shè)置pandas的屬性,比如打印出來數(shù)據(jù)時(shí)顯示多少列,顯示多寬等等,可以一次性設(shè)置多個(gè)格式如下
例子:
print(pd.set_option('display.max_columns',None,'display.width',10))
python dataframe 獲得 列名columns 和行名稱 index
dfname._stat_axis.values.tolist() == dfname.index.values.tolist() # 行名稱
dfname.columns.values.tolist() # 列名稱
總結(jié):
和 NumPy 一樣,Pandas 有兩個(gè)非常重要的數(shù)據(jù)結(jié)構(gòu):Series 和 DataFrame。使用 Pandas 可以直接從 csv 或 xlsx 等文件中導(dǎo)入數(shù)據(jù),以及最終輸出到 excel 表中。
Pandas 包與 NumPy 工具庫配合使用可以發(fā)揮巨大的威力,正是有了 Pandas 工具,Python 做數(shù)據(jù)挖掘才具有優(yōu)勢(shì)。