數(shù)據(jù)科學(xué)篇: Pandas庫的使用

在數(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)SeriesDataframe

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ù)indexvaluescolumnsaggfunc

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ì)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,363評(píng)論 6 532
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,497評(píng)論 3 416
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,305評(píng)論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,962評(píng)論 1 311
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,727評(píng)論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,193評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,257評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,411評(píng)論 0 288
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,945評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,777評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,978評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,519評(píng)論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,216評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,642評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,878評(píng)論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,657評(píng)論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,960評(píng)論 2 373

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