第5章 Pandas入門(1)

以下內(nèi)容主要學(xué)習(xí)自《利用Python進(jìn)行數(shù)據(jù)分析》

第5章 Pandas入門(1)

pandas所包含的數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)處理工具骨杂,使得在pandas中進(jìn)行數(shù)據(jù)清洗和分析非炒牝剑快捷陕凹。從2010年成為開源項目以來杜耙,pandas的開發(fā)者社區(qū)已經(jīng)有超過800個代碼貢獻(xiàn)者佑女,他們幫助pandas成熟摸吠、成為在數(shù)據(jù)領(lǐng)域被廣泛應(yīng)用的大型類庫寸痢。

pandas支持大部分NumPy風(fēng)格的數(shù)組計算啼止,尤其是數(shù)據(jù)函數(shù)以及沒有for循環(huán)的各種數(shù)據(jù)處理献烦。但他們也有差異:

  • pandas是用來處理表格型或異質(zhì)型數(shù)據(jù)的(想想關(guān)系型數(shù)據(jù)庫中的表)巩那;
  • 而NumPy更適合處理同質(zhì)型的、數(shù)值類的數(shù)組令境。

作為約定舔庶,我會使用下面的快捷方式導(dǎo)入pandas:

import pandas as pd

因此惕橙,只要你看到pd.弥鹦,就表示對pandas的引用朦促。

pandas-series-dataframe

數(shù)據(jù)結(jié)構(gòu)

為了入門pandas,你需要熟悉兩個常用的數(shù)據(jù)結(jié)構(gòu):Series和DataFrame幻赚。

為便于理解落恼,可以把DataFrame看成是關(guān)系型數(shù)據(jù)庫的一個表佳谦、把Serise看成其中的一個列喊括。但需要警惕矢棚,它們并不是完全相同,如:盡管DataFrame通常情況下是二維的钝满,但可以用分層索引在DataFrame中展現(xiàn)更高維度的數(shù)據(jù)弯蚜。

Series

Series是一種一維的數(shù)組型對象路鹰,它包含了一個值序列收厨,并包含了數(shù)據(jù)標(biāo)簽雁竞,稱為索引(index)碑诉。

創(chuàng)建Series

從一個Python列表創(chuàng)建Series

In [1]: import pandas as pd

In [2]: obj = pd.Series([4, 7, -5, 3])

In [3]: obj
Out[3]:
0    4
1    7
2   -5
3    3
dtype: int64

如上所示,Series對象的索引在左側(cè)漫仆、值在右側(cè),默認(rèn)的索引是從0到n-1的數(shù)字索引(n是數(shù)據(jù)的總量)吗浩。如果不使用默認(rèn)的數(shù)字索引没隘,可以自定義標(biāo)簽索引阀湿,如下:

In [4]: obj = pd.Series([4,7, -5, 3], index=['d', 'b', 'a', 'c'])

In [5]: obj
Out[5]:
d    4
b    7
a   -5
c    3
dtype: int64

您還可以修改Series對象的標(biāo)簽索引陷嘴,但必須保證索引個數(shù)與元素個數(shù)相等

# 為Series對象指定一個名字
In [6]: obj.name = 'my datas'

# 為Series對象指定新的標(biāo)簽索引
In [7]: obj.index = ['張三','李四','王五','楊六']

In [8]: obj
Out[8]:
張三    4
李四    7
王五   -5
楊六    3
Name: my datas, dtype: int64

如果已經(jīng)有一個包含數(shù)據(jù)的Python字典灾挨,那么也可以生成一個Series,默認(rèn)情況下字典的鍵將成為Series的標(biāo)簽索引秒拔,如下:

In [6]: dict_datas = {'Ohio':3500, 'Texas':7100, 'Oregon':1600}

In [7]: obj = pd.Series(dict_datas)

In [8]: obj
Out[8]:
Ohio      3500
Texas     7100
Oregon    1600
dtype: int64

把Python字典對象轉(zhuǎn)換為Series對象時砂缩,仍然可以指定標(biāo)簽索引梯轻。Series將會自動匹配字典鍵喳挑,對于缺失的將賦值為NaN(not a number)伊诵,如下:

In [1]: dic_data = {'2018':-0.715068, '2019':-0.068092,'2020':0.448901}

In [2]: years = ['2017','2018','2019','2020']

In [3]: obj = pd.Series(dic_data, index=years)

In [4]: obj  # 因為字典中沒有2017曹宴,所以笛坦,被賦值為NaN
Out[4]:
2017         NaN
2018   -0.715068
2019   -0.068092
2020    0.448901
dtype: float64
訪問Series

可以通過values屬性index屬性分別獲得Series對象的值和索引:

In [1]: obj = pd.Series([4, 7, -5, 3], index=['d', 'b', 'a', 'c'])

In [2]: obj.values
Out[2]: array([ 4,  7, -5,  3], dtype=int64)

In [3]: obj.index
Out[3]: Index(['d', 'b', 'a', 'c'], dtype='object')

可以使用數(shù)字索引废离、也可以使用標(biāo)簽索引來獲取Series中元素的值:

In [4]: obj[0]  # 使用數(shù)字索引蜻韭,獲取單個元素值
Out[4]: 4

In [5]: obj['d']  # 使用標(biāo)簽索引肖方,獲取單個元素值
Out[5]: 4

In [6]: obj[0:2]  # 使用數(shù)字索引,獲取多個元素值
Out[6]:
d    4
b    7
dtype: int64

In [7]: obj['d':'b']  # 使用標(biāo)簽索引娩践,獲取多個元素值
Out[7]:
d    4
b    7
dtype: int64

某些情景中,您可以使用in關(guān)鍵字來判斷Series的索引是否包含某個值:

In [8]: 'b' in obj
Out[8]: True

In [9]: 'e' in obj
Out[9]: False

還可以使用bool值作為濾條件吨岭,得到Series對象的子集:

In [10]: obj[obj > 0]  # 選擇大于0的元素
Out[10]:
d    4
b    7
c    3
dtype: int64
修改Series的值

通過Series對象的索引(數(shù)字或標(biāo)簽均可)辣辫,可以修改Series對象的值:

In [1]: obj = pd.Series([4, 7, -5, 3], index=['d', 'b', 'a', 'c'])

In [2]: obj['b'] = -1  # 通過標(biāo)簽索引修改值

In [3]: obj[2:4] = 0  # 通過數(shù)字索引段,修改值

In [4]: obj
Out[4]:
d    4
b   -1
a    0
c    0
dtype: int64
添加Series元素

如果要給Series對象添加單個元素葬馋,那么直接為新標(biāo)簽索引賦值即可:

In [5]: obj['e'] = 7

In [6]: obj
Out[6]:
d    4
b   -1
a    0
c    0
e    7
dtype: int64

使用Series對象的append方法可以把多個元素添加到現(xiàn)有的Series對象中:

In [7]: obj2 = pd.Serise([5, -2, 8])

In [8]: obj = obj.append(obj2)

In [9]: obj
Out[9]:
d    4
b   -1
a    0
c    0
e    7
0    5
1   -2
2    8
dtype: int64
刪除Series元素

使用drop方法蛋逾、并指定要刪除的標(biāo)簽索引区匣,將刪除Series對象中的元素:

In [10]: obj.drop(labels=[0, 'c'])
Out[10]:
d    4
b   -1
a    0
e    7
1   -2
2    8
dtype: int64
運算

可以對Series對象進(jìn)行四則運算,如下:

In [1]: obj = pd.Series([4, 7, -5, 3], index=['d', 'b', 'a', 'c'])

In [3]: obj * 2  # 與標(biāo)量的四則運算姑丑,乘2切端。
Out[3]:
d     8
b    14
a   -10
c     6
dtype: int64

可以對Series對象應(yīng)用數(shù)學(xué)函數(shù)昌屉,如下:

In [4]: import numpy as np

In [5]: np.exp(obj)  # 求自然指數(shù)
Out[5]:
d      54.598150
b    1096.633158
a       0.006738
c      20.085537
dtype: float64

兩個Series對象可以用+操作符進(jìn)行所謂的“數(shù)據(jù)對齊”操作间驮,你可以認(rèn)為這個特性與數(shù)據(jù)庫的join操作相似。

In [1]: obj1 =  pd.Series([350, 160, 710, 500],
     ...:  index=['張三','李四', '王五', '楊六'])

In [2]: obj2 =  pd.Series([np.NaN, 350, 160],
     ...: index=['陳七', '張三', '李四'])

In [3]: obj = obj1 + obj2

In [4]: obj
Out[4]:
張三    700.0
李四    320.0
楊六      NaN
王五      NaN
陳七      NaN
dtype: float64

可以使用isnull方法notnull方法判斷Series對象是否包含空值屹篓。這兩個方法,即是Series的實例方法谍肤、也是pandas的頂層方法。

# 使用實例方法判斷“空值”
In [5]: obj.isnull()
Out[5]:
張三    False
李四    False
楊六     True
王五     True
陳七     True
dtype: bool

# 使用pandas頂層方法判斷“非空值”
In [6]: pd.notnull(obj)
Out[6]:
張三     True
李四     True
楊六    False
王五    False
陳七    False
dtype: bool

DataFrame

DataFrame表示的是矩陣的數(shù)據(jù)表系任,每一列可以是不同的數(shù)據(jù)類型恳蹲。DataFrame既有行索引也有列索引。DataFrame的每一列都是一個Series對象赋除。

盡管不完全正確阱缓,但可以用關(guān)系數(shù)據(jù)庫表來類比:行索引相當(dāng)于主鍵、列索引相當(dāng)于列名举农。

盡管DataFrame是二維的荆针,但你可以利用分層索引在DataFrame中展現(xiàn)更高維度的數(shù)據(jù),將在后續(xù)章節(jié)進(jìn)行討論颁糟。

創(chuàng)建DataFrame

下面的例子演示了用ndarray創(chuàng)建一個最簡單的DataFrame航背。

# 引用numpy玖媚、pandas
In [1]: import numpy as np
In [2]: import pandas as pd

# 構(gòu)建了一個3X4的二維ndarray
In [3]: arr = np.arange(12).reshape(3,4)

In [4]: arr
Out[4]:
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

# 用ndarray創(chuàng)建DataFrame
In [5]: df = pd.DataFrame(arr)

In [6]: df
Out[6]:
    0  1   2   3
0  0  1   2   3
1  4  5   6   7
2  8  9  10  11

注意上面的示例,DataFrame對象除了數(shù)據(jù)涩维,還包含列索引和行索引,缺省情況下,它們都是從0開始編號的順序值听诸。

如果我們不想使用默認(rèn)的行/列索引仔蝌,可以用index屬性columns屬性修改DataFrame對象的行/列索引锡宋。

In [7]: df.index = ['a','b','c']

In [8]: df.columns = ['cn1','cn2','cn3','cn4']

# 經(jīng)過以上的修改役首,DataFrame有了新的行列索引
In [9]: df
Out[9]:
   cn1  cn2  cn3  cn4
a    0    1    2    3
b    4    5    6    7
c    8    9   10   11

# 可以給DataFrame的name屬性賦值,類似于定義表名
In [10]: df.name = 'my datas'

當(dāng)然,index、columns可以在構(gòu)造時就指定,以下代碼的效果與上面是一致的。

# 引用numpy故黑、pandas
In [1]: import numpy as np
In [2]: import pandas as pd

# 構(gòu)建了一個3X4的二維ndarray
In [3]: arr = np.arange(12).reshape(3,4)

# 用ndarray創(chuàng)建DataFrame
In [24]: df = pd.DataFrame(arr,
    ...: index = ['a','b','c'],
    ...: columns = ['cn1','cn2','cn3','cn4'])

In [25]: df
Out[25]:
   cn1  cn2  cn3  cn4
a    0    1    2    3
b    4    5    6    7
c    8    9   10   11

包含等長度列表或NumPy數(shù)組的字典揭北,也可以用來構(gòu)建DataFrame。字典的鍵將被pandas視為列名登馒。請參考如下的代碼:

In [1]: data = {'state': ['Ohio','Ohio','Ohio','Nevada','Nevada','Nevada'],
   ...: 'year': [2000,2001,2002,2001,2002,2003],
   ...: 'pop': [1.5,1.7,3.6,2.4,2.9,3.2]}

In [2]: df = pd.DataFrame(data)

In [3]: df
Out[3]:
   state  year  pop
0    Ohio  2000  1.5
1    Ohio  2001  1.7
2    Ohio  2002  3.6
3  Nevada  2001  2.4
4  Nevada  2002  2.9
5  Nevada  2003  3.2

用字典構(gòu)建DataFrame時,如果傳入columns參數(shù)胎许,pandas會按照columns的順序?qū)α信判颍蝗绻值涞逆I不包含在colums中,pandas會填充缺失值,如下:

In [4]: df = pd.DataFrame(data, columns=['year','state','pop','debt'],
    ...: index=['one','tow','three','four','five','six'])

In [5]: df
Out[5]:
       year   state  pop debt
one    2000    Ohio  1.5  NaN
tow    2001    Ohio  1.7  NaN
three  2002    Ohio  3.6  NaN
four   2001  Nevada  2.4  NaN
five   2002  Nevada  2.9  NaN
six    2003  Nevada  3.2  NaN

在上面的示例中扬蕊,我們還傳入了index參數(shù)垂睬,用來取代pandas默認(rèn)的卡儒、從0開始的數(shù)字行索引袜蚕。

使用DataFrame構(gòu)造函數(shù)創(chuàng)建DataFrame對象的有效輸入小結(jié)如下:

類型 說明
2D ndarray 二維數(shù)組虐急,行和列的標(biāo)簽是可選參數(shù)
數(shù)組疚宇、列表抗蠢、元組構(gòu)成的字典 每個序列成為DataFrame的一列,所有序列必須長度相同
NumPy結(jié)構(gòu)化數(shù)組 與數(shù)組構(gòu)成的字典一致
Series構(gòu)成的字典 每個值成為一列销斟,每個Series的索引聯(lián)合起來形成行索引
字典構(gòu)成的字典 每個內(nèi)部字典成為一列泼橘,鍵聯(lián)合起來形成行索引
字典或Series構(gòu)成的列表 列表中的一個元素形成一行笨腥,字典鍵或Series索引聯(lián)合起來形成列標(biāo)簽
列表或元組構(gòu)成的列表 與2D ndarray一致
其它DataFrame 默認(rèn)使用原DataFrame的行列索引
NumPy MaskedArray 與2D ndarry一致,但隱藏值會成為NaN缺失值
訪問數(shù)據(jù)

在科學(xué)計算中闲孤,數(shù)據(jù)量往往非常大谆级。如果僅要看看DataFrame的結(jié)構(gòu),可以調(diào)用head方法獲取頭部的5行數(shù)據(jù)

In [1]: data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada', 'Nevada'], 'year': [2000, 2001, 2002, 2001, 2002, 2003], 'pop': [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]}

In [2]: df = pd.DataFrame(data, columns=['year', 'state', 'pop'], index=['one', 'tow', 'three', 'four', 'five', 'six'])

In [3]: df
Out[3]:
       year   state  pop
one    2000    Ohio  1.5
tow    2001    Ohio  1.7
three  2002    Ohio  3.6
four   2001  Nevada  2.4
five   2002  Nevada  2.9
six    2003  Nevada  3.2

In [4]: df.head()
Out[4]:
       year   state  pop
one    2000    Ohio  1.5
tow    2001    Ohio  1.7
three  2002    Ohio  3.6
four   2001  Nevada  2.4
five   2002  Nevada  2.9

下面的示例演示了獲取DataFrame的行數(shù)讼积、列數(shù)肥照、行索引、列索引等:

# 獲取行索引
In [5]: df.index
Out[5]: Index(['ont', 'tow', 'three', 'four', 'five', 'six'], dtype='object')

# 得到行數(shù)
In [6]: len(df.index)
Out[6]: 6

# 獲取列索引
In [7]: df.columns
Out[7]: Index(['year', 'state', 'pop'], dtype='object')

# 得到列數(shù)
In [8]: len(df.columns)
Out[8]: 3

獲取行數(shù)據(jù)勤众,采用與NumPy一致的索引方式舆绎,索引值可以是數(shù)字索引或標(biāo)簽索引,如下:

In [9]: df[1:3]  # 用數(shù)字索引獲取第1们颜、2行數(shù)據(jù)
Out[9]:
       year state  pop
two    2001  Ohio  1.7
three  2002  Ohio  3.6

In [10]: df['four':]  # 用標(biāo)簽索引獲取行數(shù)據(jù)
Out[10]:
      year   state  pop
four  2001  Nevada  2.4
five  2002  Nevada  2.9
six   2003  Nevada  3.2

獲取列數(shù)據(jù)吕朵,采用與字典鍵值索引一致的語法,按列索引得到的結(jié)果是Series對象:

In [11]: df['year']
Out[11]:
ont      2000
two      2001
three    2002
four     2001
five     2002
six      2003
Name: year, dtype: int64

獲取單元數(shù)據(jù)掌桩,需要同時傳入列索引和行索引边锁,如下:

In [12]: df['year']['three']
Out[12]: 2002

獲取切片數(shù)據(jù),就是得到部分的行列數(shù)據(jù)子集波岛,關(guān)鍵的語法是:起始行索引用冒號分割茅坛,列索引要明確指定并封裝為一個列表。至于行索引在前還是列索引在前,都無所謂贡蓖。如下:

In [13]: df['three':'five'][['state','pop']]
Out[13]:
        state  pop
three    Ohio  3.6
four   Nevada  2.4
five   Nevada  2.9

# 行列索引的先后次序沒有關(guān)系曹鸠,下面的語句與如上的等效
In [12]: df[['state','pop']]['three':'five']

調(diào)用DataFrame對象的values屬性,可以得到ndarray類型的數(shù)據(jù)集(沒有行列索引):

In [14]: df.values
Out[14]:
array([[2000, 'Ohio', 1.5],
       [2001, 'Ohio', 1.7],
       [2002, 'Ohio', 3.6],
       [2001, 'Nevada', 2.4],
       [2002, 'Nevada', 2.9],
       [2003, 'Nevada', 3.2]], dtype=object)
修改數(shù)據(jù)

初始化dataframe如下:

In [1]: data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada', 'Nevada'], 'year': [2000, 2001, 2002, 2001, 2002, 2003], 'pop': [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]}

In [2]: df = pd.DataFrame(data, columns=['year', 'state', 'pop'], index=['one', 'tow', 'three', 'four', 'five', 'six'])

In [3]: df
Out[3]:
       year   state  pop
one    2000    Ohio  1.5
tow    2001    Ohio  1.7
three  2002    Ohio  3.6
four   2001  Nevada  2.4
five   2002  Nevada  2.9
six    2003  Nevada  3.2

修改行數(shù)據(jù)斥铺,可以通過指定行索引為dataframe的行賦值彻桃,下面的例子把一個固定值賦值給行:

# 通過指定行索引為第一行數(shù)據(jù)賦值
In [4]: df[0:1] = 0

In [5]: df
Out[5]:
       year   state  pop
one       0       0  0.0
tow    2001    Ohio  1.7
three  2002    Ohio  3.6
four   2001  Nevada  2.4
five   2002  Nevada  2.9
six    2003  Nevada  3.2

您可以看出,上面的示例能夠正確運行晾蜘,按并不是一個好的示例邻眷。因為每列的數(shù)據(jù)類型并不相同,為某行的所有列賦值為同一個常量會導(dǎo)致有歧義剔交。

更好些的方式肆饶,是為某行賦值一個列表,如下所示:

In [6]: df[0:1] = [2000,'Ohio',3.8]

In [7]: df
Out[7]:
       year   state  pop
one    2000    Ohio  3.8
tow    2001    Ohio  1.7
three  2002    Ohio  3.6
four   2001  Nevada  2.4
five   2002  Nevada  2.9
six    2003  Nevada  3.2

修改列數(shù)據(jù)
可以把常數(shù)賦值給某一列

In [8]: df['pop']=0

In [9]: df
Out[9]:
       year   state  pop
one    2000    Ohio    0
tow    2001    Ohio    0
three  2002    Ohio    0
four   2001  Nevada    0
five   2002  Nevada    0
six    2003  Nevada    0

也可以把一個列表賦值給某一列:

In [10]: df['pop']= [3.3, 1.2, 3.1, 1.9, 2.4, 2.7]

In [11]: df
Out[11]:
       year   state  pop
one    2000    Ohio  3.3
tow    2001    Ohio  1.2
three  2002    Ohio  3.1
four   2001  Nevada  1.9
five   2002  Nevada  2.4
six    2003  Nevada  2.7

還可以在列上直接使用標(biāo)量運算:

In [12]: df['pop'] = df['pop'] * 3

In [13]: df
Out[13]:
       year   state  pop
one    2000    Ohio  9.9
tow    2001    Ohio  3.6
three  2002    Ohio  9.3
four   2001  Nevada  5.7
five   2002  Nevada  7.2
six    2003  Nevada  8.1

修改單元數(shù)據(jù)岖常,需要同時指定行索引和列索引驯镊。
下面的示例演示了如何修改一個單元格數(shù)據(jù)

In [14]: df[0:1]['pop'] = 8.8
SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.Try using .loc[row_indexer,col_indexer] = value instead

In [15]: df
Out[15]:
       year   state  pop
one    2000    Ohio  8.8
tow    2001    Ohio  3.6
three  2002    Ohio  9.3
four   2001  Nevada  5.7
five   2002  Nevada  7.2
six    2003  Nevada  8.1

請注意,雖然上面的語句可以完成單元格賦值竭鞍,但引發(fā)了一個警告板惑,該警告說明:比起使用上面的方法,使用.loc[row_indexer,col_indexer] = value更好偎快,在下方的整數(shù)索引章節(jié)會有更詳細(xì)的說明冯乘。

添加數(shù)據(jù)

初始化dataframe如下:

In [1]: data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada', 'Nevada'], 'year': [2000, 2001, 2002, 2001, 2002, 2003], 'pop': [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]}

In [2]: df = pd.DataFrame(data, columns=['year', 'state', 'pop'], index=['one', 'tow', 'three', 'four', 'five', 'six'])

In [3]: df
Out[3]:
       year   state  pop
one    2000    Ohio  1.5
tow    2001    Ohio  1.7
three  2002    Ohio  3.6
four   2001  Nevada  2.4
five   2002  Nevada  2.9
six    2003  Nevada  3.2

添加行數(shù)據(jù)
下面的示例使用字典對象為dataframe添加一行

In [4]: df.append({'year': 2001, 'state': 'Kilo', 'pop': 2.5}, ignore_index=True)
Out[4]:
   year   state  pop
0  2000    Ohio  1.5
1  2001    Ohio  1.7
2  2002    Ohio  3.6
3  2001  Nevada  2.4
4  2002  Nevada  2.9
5  2003  Nevada  3.2
6  2001    Kilo  2.5

在上面的代碼中,如果不使用ignore_index=True參數(shù)滨砍,會報告錯誤“TypeError: Can only append a Series if ignore_index=True or if the Series has a name”往湿。

下面的代碼演示如何用Series對象為dataframe添加行數(shù)據(jù),其效果與上面是一樣的惋戏。

In [5]: rd = pd.Series({'year': 2001, 'state': 'Kilo', 'pop': 2.5} , name='seven')

In [6]: df.append(rd)
Out[6]:
       year   state  pop
one    2000    Ohio  1.5
tow    2001    Ohio  1.7
three  2002    Ohio  3.6
four   2001  Nevada  2.4
five   2002  Nevada  2.9
six    2003  Nevada  3.2
seven  2001    Kilo  2.5

另外领追,如果兩個dataframe的結(jié)構(gòu)一致,也可以使用append方法追加行數(shù)據(jù)响逢。

添加列數(shù)據(jù)
使用insert方法為dataframe對象添加一列绒窑。

# 把名為memo的數(shù)據(jù)添加到第二列
In [7]: df.insert(1, 'memo', ['m1','m2','m3','m4','m5','m6'])

In [8]: df
Out[8]:
       year memo   state  pop
one    2000   m1    Ohio  1.5
tow    2001   m2    Ohio  1.7
three  2002   m3    Ohio  3.6
four   2001   m4  Nevada  2.4
five   2002   m5  Nevada  2.9
six    2003   m6  Nevada  3.2
刪除數(shù)據(jù)

使用drop方法刪除行列,該方法中的參數(shù)axis為1表示刪除列舔亭,0表示刪除行些膨。inplace為True表示直接對原表修改。

下面的示例演示了如何刪除列

In [9]: df.drop('memo', axis=1, inplace=True)

In [10]: df
Out[10]:
       year   state  pop
one    2000    Ohio  1.5
tow    2001    Ohio  1.7
three  2002    Ohio  3.6
four   2001  Nevada  2.4
five   2002  Nevada  2.9
six    2003  Nevada  3.2

下面的示例演示了如何刪除行

In [11]: df.drop(['two','three','five'], axis=0, inplace=True)

In [12]: df
Out[12]:
      year   state  pop
one   2000    Ohio  1.5
four  2001  Nevada  2.4
six   2003  Nevada  3.2
運算

使用dataframe對象的stack方法unstack方法可以行列轉(zhuǎn)置钦铺,如下:

In [13]: df.stack()
Out[13]:
one   year       2000
      state      Ohio
      pop         1.5
four  year       2001
      state    Nevada
      pop         2.4
six   year       2003
      state    Nevada
      pop         3.2
dtype: object

In [14]: df.stack().unstack(0)
Out[14]:
        one    four     six
year   2000    2001    2003
state  Ohio  Nevada  Nevada
pop     1.5     2.4     3.2

index

索引對象

pandas中的索引對象是用于存儲軸標(biāo)簽和其它元數(shù)據(jù)的订雾。大多數(shù)時候,我們并不常用索引對象提供的功能矛洞,但是因為一些操作會產(chǎn)生包含索引化數(shù)據(jù)的結(jié)果洼哎,因此有必要理解索引是如何工作的。

在構(gòu)造Series或DataFrame時,你所使用的任意數(shù)組或標(biāo)簽都可以在內(nèi)部轉(zhuǎn)換為索引對象

In [1]: import numpy as np

In [2]: import pandas as pd

In [3]: obj = pd.Series(range(3), index=['a', 'b', 'c'])

In [4]: index = obj.index

In [5]: index
Out[5]: Index(['a', 'b', 'c'], dtype='object')

In [6]: index[1:]
Out[6]: Index(['b', 'c'], dtype='object')

注意:索引對象是不可改變的噩峦,也就是說用戶無法修改索引對象锭沟。不變性使得在多種數(shù)據(jù)結(jié)構(gòu)中分享索引對象更為安全。另外识补,pandas索引對象可以包含重復(fù)的標(biāo)簽數(shù)據(jù)族淮。

方法和屬性

索引對象提供了一些方法和屬性,如下表所示:

方法 描述
append 將額外的索引對象追加到原索引對象后凭涂,產(chǎn)生一個新的索引
difference 計算兩個索引的差集
intersection 計算兩個索引的交集
union 計算兩個索引的并集
isin 計算表示每一個值是否在容器中
delete 將位置i的元素刪除祝辣,并產(chǎn)生新的索引
drop 根據(jù)傳參刪除指定索引值,并產(chǎn)生新的索引
insert 在位置i處插入元素切油,并產(chǎn)生新的索引
is_monotonic 如果索引序列遞增较幌,返回True
is_unique 如果索引序列值唯一,返回True
unique 計算索引的唯一值序列
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末白翻,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子绢片,更是在濱河造成了極大的恐慌滤馍,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件底循,死亡現(xiàn)場離奇詭異巢株,居然都是意外死亡,警方通過查閱死者的電腦和手機熙涤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進(jìn)店門阁苞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人祠挫,你說我怎么就攤上這事那槽。” “怎么了等舔?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵骚灸,是天一觀的道長。 經(jīng)常有香客問我慌植,道長甚牲,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任蝶柿,我火速辦了婚禮丈钙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘交汤。我一直安慰自己雏赦,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著喉誊,像睡著了一般邀摆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上伍茄,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天栋盹,我揣著相機與錄音,去河邊找鬼敷矫。 笑死例获,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的曹仗。 我是一名探鬼主播榨汤,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼怎茫!你這毒婦竟也來了收壕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤轨蛤,失蹤者是張志新(化名)和其女友劉穎蜜宪,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體祥山,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡圃验,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了缝呕。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片澳窑。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖供常,靈堂內(nèi)的尸體忽然破棺而出摊聋,到底是詐尸還是另有隱情,我是刑警寧澤话侧,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布栗精,位于F島的核電站,受9級特大地震影響瞻鹏,放射性物質(zhì)發(fā)生泄漏悲立。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一新博、第九天 我趴在偏房一處隱蔽的房頂上張望薪夕。 院中可真熱鬧,春花似錦赫悄、人聲如沸原献。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽姑隅。三九已至写隶,卻和暖如春讲仰,著一層夾襖步出監(jiān)牢的瞬間慕趴,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工冕房, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留毫捣,地道東北人。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓牌柄,卻偏偏與公主長得像,于是被迫代替她去往敵國和親侧甫。 傳聞我的和親對象是個殘疾皇子珊佣,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,960評論 2 355