Python11--數(shù)據(jù)分析Pandas庫基本概念

一,含義

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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末掂骏,一起剝皮案震驚了整個(gè)濱河市轰驳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌弟灼,老刑警劉巖级解,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異田绑,居然都是意外死亡勤哗,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進(jìn)店門掩驱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來芒划,“玉大人,你說我怎么就攤上這事欧穴∶癖疲” “怎么了?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵涮帘,是天一觀的道長拼苍。 經(jīng)常有香客問我,道長调缨,這世上最難降的妖魔是什么疮鲫? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮弦叶,結(jié)果婚禮上俊犯,老公的妹妹穿的比我還像新娘。我一直安慰自己湾蔓,他們只是感情好瘫析,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般贬循。 火紅的嫁衣襯著肌膚如雪咸包。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天杖虾,我揣著相機(jī)與錄音烂瘫,去河邊找鬼。 笑死奇适,一個(gè)胖子當(dāng)著我的面吹牛坟比,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播嚷往,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼葛账,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了皮仁?” 一聲冷哼從身側(cè)響起籍琳,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎贷祈,沒想到半個(gè)月后趋急,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡势誊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年呜达,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片粟耻。...
    茶點(diǎn)故事閱讀 40,872評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡查近,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出勋颖,到底是詐尸還是另有隱情嗦嗡,我是刑警寧澤,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布饭玲,位于F島的核電站,受9級特大地震影響叁执,放射性物質(zhì)發(fā)生泄漏茄厘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一谈宛、第九天 我趴在偏房一處隱蔽的房頂上張望次哈。 院中可真熱鬧,春花似錦吆录、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至巨坊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間此改,已是汗流浹背趾撵。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留共啃,地道東北人占调。 一個(gè)月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像移剪,于是被迫代替她去往敵國和親究珊。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評論 2 361

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