一,含義
Pandas的名稱來自于面板數(shù)據(jù)(panel data)和Python數(shù)據(jù)分析(data analysis)钠导。
Pandas是一個(gè)強(qiáng)大的分析結(jié)構(gòu)化數(shù)據(jù)的工具集,基于NumPy構(gòu)建痪蝇,提供了 高級數(shù)據(jù)結(jié)構(gòu) 和 數(shù)據(jù)操作工具弱卡,它是使Python成為強(qiáng)大而高效的數(shù)據(jù)分析環(huán)境的重要因素之一。
特點(diǎn):
(1)一個(gè)強(qiáng)大的分析和操作大型結(jié)構(gòu)化數(shù)據(jù)集所需的工具集
(2)基礎(chǔ)是NumPy诺苹,提供了高性能矩陣的運(yùn)算
(3)提供了大量能夠快速便捷地處理數(shù)據(jù)的函數(shù)和方法
(4)應(yīng)用于數(shù)據(jù)挖掘咕晋,數(shù)據(jù)分析
(5)提供數(shù)據(jù)清洗功能
二,數(shù)據(jù)結(jié)構(gòu)
1收奔、Series
Series是一種類似于一維數(shù)組的 對象掌呜,由一組數(shù)據(jù)(各種NumPy數(shù)據(jù)類型)以及一組與之對應(yīng)的索引(數(shù)據(jù)標(biāo)簽)組成。
Series類似一維數(shù)組的對象
Series由數(shù)據(jù)和索引組成:索引(index)在左坪哄,數(shù)據(jù)(values)在右质蕉;索引是自動(dòng)創(chuàng)建的
(1)通過list構(gòu)建Series
格式:ser_obj = pd.Series(range(10))
示例數(shù)據(jù):
# 導(dǎo)入pandas,別名 pd
import pandas as pd
# 通過list構(gòu)建Series
ser_obj = pd.Series(range(10, 20))
print(ser_obj.head(3))
print(ser_obj)
print(type(ser_obj))
顯示結(jié)果:
通過list構(gòu)建Series
(2)獲取數(shù)據(jù)和索引
格式:ser_obj.index 和 ser_obj.values
示例數(shù)據(jù):
# 導(dǎo)入pandas翩肌,別名 pd
import pandas as pd
ser_obj = pd.Series(range(10, 20))
# 獲取數(shù)據(jù)
print(ser_obj.values)
# 獲取索引
print(ser_obj.index)
顯示結(jié)果:
獲取數(shù)據(jù)和索引
(3)通過索引獲取數(shù)據(jù)
格式:ser_obj[idx]
示例數(shù)據(jù):
# 導(dǎo)入pandas模暗,別名 pd
import pandas as pd
ser_obj = pd.Series(range(10, 20))
#通過索引獲取數(shù)據(jù)
print(ser_obj[0])
print(ser_obj[8])
顯示結(jié)果:
通過索引獲取數(shù)據(jù)
(4)索引與數(shù)據(jù)的對應(yīng)關(guān)系不被運(yùn)算結(jié)果影響
示例數(shù)據(jù):
# 導(dǎo)入pandas,別名 pd
import pandas as pd
ser_obj = pd.Series(range(10, 20))
# 索引與數(shù)據(jù)的對應(yīng)關(guān)系不被運(yùn)算結(jié)果影響
print(ser_obj * 2)
print(ser_obj > 15)
顯示結(jié)果:
索引與數(shù)據(jù)的對應(yīng)關(guān)系不被運(yùn)算結(jié)果影響
(5)通過dict構(gòu)建Series
示例代碼:
# 導(dǎo)入pandas念祭,別名 pd
import pandas as pd
ser_obj = pd.Series(range(10, 20))
# 通過dict構(gòu)建Series
year_data = {2001: 17.8, 2002: 20.1, 2003: 16.5}
ser_obj2 = pd.Series(year_data)
print(ser_obj2.head())
print(ser_obj2.index)
顯示結(jié)果:
通過dict構(gòu)建Series
(6)通過dict構(gòu)建Series的name屬性
對象名:ser_obj.name
對象索引名:ser_obj.index.name
示例代碼:
# 導(dǎo)入pandas兑宇,別名 pd
import pandas as pd
year_data = {2001: 17.8, 2002: 20.1, 2003: 16.5}
ser_obj2 = pd.Series(year_data)
# name屬性
ser_obj2.name = 'temp'
ser_obj2.index.name = 'year'
print(ser_obj2.head())
顯示結(jié)果:
Series的name屬性
2、DataFrame
DataFrame是一個(gè)表格型的數(shù)據(jù)結(jié)構(gòu)粱坤,它含有一組有序的列隶糕,每列可以是不同類型的值祝钢。DataFrame既有行索引也有列索引,它可以被看做是由Series組成的字典(共用同一個(gè)索引)若厚,數(shù)據(jù)是以二維結(jié)構(gòu)存放的拦英。
類似多維數(shù)組/表格數(shù)據(jù) (如,excel, R中的data.frame)测秸;每列數(shù)據(jù)可以是不同的類型疤估;索引包括列索引和行索引。
(1)通過ndarray構(gòu)建DataFrame
示例代碼:
# 導(dǎo)入 numpy 霎冯,別名 np
import numpy as np
# 導(dǎo)入pandas铃拇,別名 pd
import pandas as pd
# 通過ndarray構(gòu)建DataFrame
array = np.random.randn(5,4)
print(array)
df_obj = pd.DataFrame(array)
print(df_obj.head())
顯示結(jié)果:
通過ndarray構(gòu)建DataFrame
(2)通過dict構(gòu)建DataFrame
示例代碼:
# 導(dǎo)入 numpy ,別名 np
import numpy as np
# 導(dǎo)入pandas沈撞,別名 pd
import pandas as pd
# 通過dict構(gòu)建DataFrame
dict_data = {'A': 1,
'B': pd.Timestamp('20170426'),
'C': pd.Series(1, index=list(range(4)),dtype='float32'),
'D': np.array([3] * 4,dtype='int32'),
'E': ["Python","Java","C++","C"],
'F': 'ITCast' }
#print dict_data
df_obj2 = pd.DataFrame(dict_data)
print(df_obj2)
顯示結(jié)果:
通過dict構(gòu)建DataFrame
(3)通過列索引獲取列數(shù)據(jù)(Series類型)
格式:df_obj[col_idx] 或 df_obj.col_idx
示例代碼:
# 導(dǎo)入 numpy 慷荔,別名 np
import numpy as np
# 導(dǎo)入pandas,別名 pd
import pandas as pd
# 通過dict構(gòu)建DataFrame
dict_data = {'A': 1,
'B': pd.Timestamp('20170426'),
'C': pd.Series(1, index=list(range(4)),dtype='float32'),
'D': np.array([3] * 4,dtype='int32'),
'E': ["Python","Java","C++","C"],
'F': 'ITCast' }
#print dict_data
df_obj2 = pd.DataFrame(dict_data)
# 通過列索引獲取列數(shù)據(jù)
print(df_obj2['A'])
print(type(df_obj2['A']))
print(df_obj2.A)
顯示結(jié)果:
通過列索引獲取列數(shù)據(jù)(Series類型)
(4)增加列數(shù)據(jù)
格式:df_obj[new_col_idx] = data
類似Python的 dict添加key-value
示例代碼:
# 導(dǎo)入 numpy 缠俺,別名 np
import numpy as np
# 導(dǎo)入pandas显晶,別名 pd
import pandas as pd
# 通過dict構(gòu)建DataFrame
dict_data = {'A': 1,
'B': pd.Timestamp('20170426'),
'C': pd.Series(1, index=list(range(4)),dtype='float32'),
'D': np.array([3] * 4,dtype='int32'),
'E': ["Python","Java","C++","C"],
'F': 'ITCast' }
#print dict_data
df_obj2 = pd.DataFrame(dict_data)
print(df_obj2)
# 增加列
df_obj2['G'] = df_obj2['D'] + 4
print(df_obj2.head())
顯示結(jié)果:
增加列數(shù)據(jù)
(5)刪除列數(shù)據(jù)
格式:del df_obj[col_idx]
示例代碼:
# 導(dǎo)入 numpy ,別名 np
import numpy as np
# 導(dǎo)入pandas壹士,別名 pd
import pandas as pd
# 通過dict構(gòu)建DataFrame
dict_data = {'A': 1,
'B': pd.Timestamp('20170426'),
'C': pd.Series(1, index=list(range(4)),dtype='float32'),
'D': np.array([3] * 4,dtype='int32'),
'E': ["Python","Java","C++","C"],
'F': 'ITCast' }
#print dict_data
df_obj2 = pd.DataFrame(dict_data)
print(df_obj2)
# 增加列
df_obj2['G'] = df_obj2['D'] + 4
print(df_obj2.head())
# 刪除列
del(df_obj2['G'] )
print(df_obj2.head())
顯示結(jié)果:
刪除列
三磷雇,索引操作
1、索引對象Index
(1)Series和DataFrame中的索引都是Index對象
(2)索引對象不可變躏救,保證了數(shù)據(jù)的安全
(3)常見的Index種類:
1唯笙,Index,索引
2盒使,Int64Index崩掘,整數(shù)索引
3,MultiIndex少办,層級索引
4苞慢,DatetimeIndex,時(shí)間戳類型
2凡泣、Series索引
(1)index 指定行索引名
示例代碼:
# 導(dǎo)入numpy枉疼,別名np
import numpy as np
# 導(dǎo)入pandas,別名 pd
import pandas as pd
ser_obj = pd.Series(range(5), index = ['a', 'b', 'c', 'd', 'e'])
print(ser_obj.head())
顯示結(jié)果:
index 指定行索引名
(2)行索引
格式:ser_obj[‘label’], ser_obj[pos]
示例代碼:
# 導(dǎo)入numpy鞋拟,別名np
import numpy as np
# 導(dǎo)入pandas骂维,別名 pd
import pandas as pd
ser_obj = pd.Series(range(5), index = ['a', 'b', 'c', 'd', 'e'])
print(ser_obj['b'])
print(ser_obj[2])
顯示結(jié)果:
行索引
(3)切片索引
格式:ser_obj[2:4], ser_obj[‘label1’: ’label3’]
注意,按索引名切片操作時(shí)贺纲,是包含終止索引的航闺。
示例代碼:
# 導(dǎo)入numpy,別名np
import numpy as np
# 導(dǎo)入pandas,別名 pd
import pandas as pd
ser_obj = pd.Series(range(5), index = ['a', 'b', 'c', 'd', 'e'])
# 切片索引
print(ser_obj[1:3])
print(ser_obj['b':'d'])
顯示結(jié)果:
切片索引
(4)不連續(xù)索引
格式:ser_obj[[‘label1’, ’label2’, ‘label3’]]
示例代碼:
# 導(dǎo)入numpy潦刃,別名np
import numpy as np
# 導(dǎo)入pandas侮措,別名 pd
import pandas as pd
ser_obj = pd.Series(range(5), index = ['a', 'b', 'c', 'd', 'e'])
# 不連續(xù)索引
print(ser_obj[[0, 2, 4]])
print(ser_obj[['a', 'e']])
顯示結(jié)果:
不連續(xù)索引
(5)布爾索引
示例代碼:
# 導(dǎo)入numpy,別名np
import numpy as np
# 導(dǎo)入pandas乖杠,別名 pd
import pandas as pd
ser_obj = pd.Series(range(5), index = ['a', 'b', 'c', 'd', 'e'])
# 布爾索引
ser_bool = ser_obj > 2
print(ser_bool)
print(ser_obj[ser_bool])
print(ser_obj[ser_obj > 2])
顯示結(jié)果:
布爾索引
3分扎、DataFrame索引
(1)columns 指定列索引名
示例代碼:
# 導(dǎo)入numpy,別名np
import numpy as np
# 導(dǎo)入pandas胧洒,別名 pd
import pandas as pd
df_obj = pd.DataFrame(np.random.randn(5,4), columns = ['a', 'b', 'c', 'd'])
print(df_obj.head())
顯示結(jié)果:
columns 指定列索引名
(2)列索引
格式:df_obj[[‘label’]]
示例代碼:
# 導(dǎo)入numpy畏吓,別名np
import numpy as np
# 導(dǎo)入pandas,別名 pd
import pandas as pd
df_obj = pd.DataFrame(np.random.randn(5,4), columns = ['a', 'b', 'c', 'd'])
# 列索引
print(df_obj['a']) # 返回Series類型
print(df_obj[[0]]) # 返回DataFrame類型
print(type(df_obj[[0]])) # 返回DataFrame類型
顯示結(jié)果:
列索引
(3)不連續(xù)索引
格式:df_obj[[‘label1’, ‘label2’]]
示例代碼:
# 導(dǎo)入numpy卫漫,別名np
import numpy as np
# 導(dǎo)入pandas菲饼,別名 pd
import pandas as pd
df_obj = pd.DataFrame(np.random.randn(5,4), columns = ['a', 'b', 'c', 'd'])
# 不連續(xù)索引
print(df_obj[['a','c']])
print(df_obj.iloc[[1, 3]])
顯示結(jié)果:
不連續(xù)索引
4、高級索引:標(biāo)簽列赎、位置和混合
(1)loc 標(biāo)簽索引
DataFrame 不能直接切片宏悦,可以通過loc來做切片
loc是基于標(biāo)簽名的索引,也就是我們自定義的索引名
示例代碼:
# 導(dǎo)入numpy包吝,別名np
import numpy as np
# 導(dǎo)入pandas饼煞,別名 pd
import pandas as pd
ser_obj = pd.Series(range(5), index = ['a', 'b', 'c', 'd', 'e'])
df_obj = pd.DataFrame(np.random.randn(5,4), columns = ['a', 'b', 'c', 'd'])
# 標(biāo)簽索引 loc
# Series
print(ser_obj['b':'d'])
print(ser_obj.loc['b':'d'])
# DataFrame
print(df_obj['a'])
# 第一個(gè)參數(shù)索引行,第二個(gè)參數(shù)是列
print(df_obj.loc[0:2, 'a'])
顯示結(jié)果:
loc 標(biāo)簽索引
(2)iloc 位置索引
作用和loc一樣漏策,不過是基于索引編號來索引
示例代碼:
# 導(dǎo)入numpy派哲,別名np
import numpy as np
# 導(dǎo)入pandas臼氨,別名 pd
import pandas as pd
ser_obj = pd.Series(range(5), index = ['a', 'b', 'c', 'd', 'e'])
df_obj = pd.DataFrame(np.random.randn(5,4), columns = ['a', 'b', 'c', 'd'])
# 整型位置索引 iloc
# Series
print(ser_obj[1:3])
print(ser_obj.iloc[1:3])
# DataFrame
print(df_obj.iloc[0:2, 0]) # 注意和df_obj.loc[0:2, 'a']的區(qū)別
顯示結(jié)果:
iloc 位置索引
(3)ix 標(biāo)簽與位置混合索引
ix是以上二者的綜合掺喻,既可以使用索引編號,又可以使用自定義索引储矩,要視情況不同來使用感耙,如果索引既有數(shù)字又有英文,那么這種方式是不建議使用的持隧,容易導(dǎo)致定位的混亂即硼。
示例代碼:
# 導(dǎo)入numpy,別名np
import numpy as np
# 導(dǎo)入pandas屡拨,別名 pd
import pandas as pd
ser_obj = pd.Series(range(5), index = ['a', 'b', 'c', 'd', 'e'])
df_obj = pd.DataFrame(np.random.randn(5,4), columns = ['a', 'b', 'c', 'd'])
# 混合索引 ix
# Series
print(ser_obj.ix[1:3])
print(ser_obj.ix['b':'c'])
# DataFrame
print(df_obj.loc[0:2, 'a'])
print(df_obj.ix[0:2, 0])
四只酥,對齊運(yùn)算
1,Series的對齊運(yùn)算
(1)Series 按行呀狼、索引對齊
示例代碼:
# 導(dǎo)入numpy裂允,別名np
import numpy as np
# 導(dǎo)入pandas,別名 pd
import pandas as pd
s1 = pd.Series(range(10, 20), index = range(10))
s2 = pd.Series(range(20, 25), index = range(5))
print('s1: ' )
print(s1)
print('')
print('s2: ')
print(s2)
顯示結(jié)果:
Series 按行哥艇、索引對齊
(2)Series的對齊運(yùn)算
示例代碼:
# 導(dǎo)入numpy绝编,別名np
import numpy as np
# 導(dǎo)入pandas,別名 pd
import pandas as pd
s1 = pd.Series(range(10, 20), index = range(10))
s2 = pd.Series(range(20, 25), index = range(5))
# Series 對齊運(yùn)算
s3 = s1 + s2
print(s3)
顯示結(jié)果:
Series的對齊運(yùn)算
2,DataFrame的對齊運(yùn)算
(1)DataFrame按行十饥、列索引對齊
示例代碼:
# 導(dǎo)入numpy窟勃,別名np
import numpy as np
# 導(dǎo)入pandas,別名 pd
import pandas as pd
df1 = pd.DataFrame(np.ones((2,2)), columns = ['a', 'b'])
df2 = pd.DataFrame(np.ones((3,3)), columns = ['a', 'b', 'c'])
print('df1: ')
print(df1)
print('')
print('df2: ')
print(df2)
顯示結(jié)果:
DataFrame按行逗堵、列索引對齊
(2)DataFrame的對齊運(yùn)算
示例代碼:
# 導(dǎo)入numpy秉氧,別名np
import numpy as np
# 導(dǎo)入pandas,別名 pd
import pandas as pd
df1 = pd.DataFrame(np.ones((2,2)), columns = ['a', 'b'])
df2 = pd.DataFrame(np.ones((3,3)), columns = ['a', 'b', 'c'])
# DataFrame對齊操作
df3 = df1 + df2
print(df3)
顯示結(jié)果:
DataFrame的對齊運(yùn)算
3蜒秤,填充未對齊的數(shù)據(jù)進(jìn)行運(yùn)算
(1) fill_value
使用add, sub, div, mul的同時(shí)谬运,通過fill_value指定填充值,未對齊的數(shù)據(jù)將和填充值做運(yùn)算垦藏。
示例代碼:
# 導(dǎo)入numpy梆暖,別名np
import numpy as np
# 導(dǎo)入pandas,別名 pd
import pandas as pd
s1 = pd.Series(range(10, 20), index = range(10))
s2 = pd.Series(range(20, 25), index = range(5))
df1 = pd.DataFrame(np.ones((2,2)), columns = ['a', 'b'])
df2 = pd.DataFrame(np.ones((3,3)), columns = ['a', 'b', 'c'])
print(s1)
print(s2)
s1.add(s2, fill_value = -1)
print(df1)
print(df2)
df1.sub(df2, fill_value = 2.)
顯示結(jié)果:
fill_value