以下內(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的引用朦促。
數(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 | 計算索引的唯一值序列 |