天天看點

Pandas 資料分析基礎

Pandas

安裝

  • anaconda 安裝:
    • conda list pandas 檢視是否已經安裝
    • conda install pandas
    • conda update pandas
  • pip 安裝
    • pip install pandas
  • apt 安裝
    • sudo apt-get install python-pandas

測試是否安裝成功

nosetests pandases

不成功會進行提醒,可以重新安裝或者更新

pandas資料結構

  • Series
  • DataFrame

1 聲明series 對象

s = pd.Series([12,3,9,1])
s
           
s = pd.Series([12,52,4,2],index=['a','b','c','d'])
s.values
s.index
           

2 用numpy數組或其他對象定義

arr=np.array([1,2,3])
s=pd.Series(arr)
# 注意這裡的s對象中的元素是對arr的引用,如果改變arr的值,s的值也會改變

# 用作字典
dic={'red':123,'blue',122,'green':129}
s.Series(dic)
           

3 篩選元素

s[s>8] # 對values的比較
s/2 
np.log(s)
           

4 其他函數

s.unique() # 隻出現一次
s.value_counts() # 統計數量
# 做篩選
s.isin([0,3])
s[s.isin([0,3])]
# 空和不空
s.isnull()
s.notnull()
           

和excel類似

建立Frame

data={'title1':[1,2,3],'title2':[5,4,3]}
frame=pd.DataFrame(data)
frame=pd.DataFrame(data,columns=['title1'])

# index 會自動生成索引也可以通過index屬性進行更改
pd.DataFrame(data,index=['one','two','three']) # 個數需要比對
           

選取元素

frame.columns
frame.index
frame.values

frame['title1'] or frame.title1
# 行
frame.ix[2]
frame.ix[[0,1]]
frame[0:2]
frame['title1'][2]
           

指派

frame.index.name='id'
frame.columns.name='cols'
frame['title1'][3]= 3
ser=pd.Series(np.arange(5))
frame['new']=ser
           

其他

# 所屬關系
frame.isin([1.0,'a'])
# 删除一列
del frame['new']
# 篩選
frame[frame <= 2]
# 轉置
frame.T
           

Index 對象

ser.idxmin()
ser.idxmax()
ser.index.is_unique()

# 執行更換索引
ser.reindex(['a','b','c'])

# 删除
ser.drop('0')
           

算數運算方法

frame1.add(frame2)
sub(), div(), mul()
           

DataFrame 與 Series的運算

frame=pd.DataFrame(np.arange(16).reshape(4,4),index=['red','blue','gren','yellow'],columns=['ball','pen','paper','socket'])

ser=pd.Series(np.arange(4),index=['ball','pen','paper','socket'])

frame - ser
           

Pandas 庫函數

按行或列執行

f=lambda x:x.max() - x.min()

def f(x):

​ return x.max()-x.min()

frame.apply(f,axis=1) # 處理行

函數

sum()
mean()
describe() # 計算多個統計量
# 排序函數
sort_index([ascending=False][axis=1])
           

對資料結構中的元素排序

# series
ser.order()
# DataFrame
frame.sort_index(by='pen')
frame.sort_index(by=['pen','pencil'])
           
位次排序
  • ser.rank()
  • ser.rank(method='first')
  • ser.rank(ascending=False)
相關性和協方差

correlation and covariance 計算通常涉及到兩個Series 對象

>>> seq2=pd.Series([3,4,3,4,5,4,3,2],['06','07','08','09','10','11','12','13'])
>>> seq1=pd.Series([1,2,3,4,4,3,2,1],['06','07','08','09','10','11','12','13'])
>>> seq1.corr(seq1)
1.0
>>> seq1.corr(seq2)
0.7745966692414835
>>> seq1.cov(seq2)
0.8571428571428571
           

DataFrame 可以實作其對象的相關性和協方差,傳回DataFrame矩陣

>>> frame2=pd.DataFrame([[1,4,3,6],[4,5,6,1],[3,3,1,5],[4,1,6,4]],index=['r','g','b','w'],columns=['ball','pen','pencil','paper'])
>>> frame2.corr()
            ball       pen    pencil     paper
ball    1.000000 -0.276026  0.577350 -0.763763
pen    -0.276026  1.000000 -0.079682 -0.361403
pencil  0.577350 -0.079682  1.000000 -0.692935
paper  -0.763763 -0.361403 -0.692935  1.000000
>>> frame2.cov()
            ball       pen    pencil     paper
ball    2.000000 -0.666667  2.000000 -2.333333
pen    -0.666667  2.916667 -0.333333 -1.333333
pencil  2.000000 -0.333333  6.000000 -3.666667
paper  -2.333333 -1.333333 -3.666667  4.666667
           

除此之外還可以計算DataFrame對象與Series或者DataFrame對象之間的關系

frame.corrwith(ser)

frame.corrwith(frame2)

NaN

過濾NaN

# series obj
ser.dropna()
or
ser[ser.notnull()]

# DataFrame obj
frame.dropna() # 整行都被删除
frame.dropna(how='all') # 删除全部Nan的列
           

為NaN填充

frame.fillna(0)
frame.filena('ball':1,'mug':2)
           

等級索引&分級

>>> mser=pd.Series(np.random.rand(6),[['a','a','b','b','c','c'],[2,3,6,4,5,8]])
>>> mser
a  2    0.936455
   3    0.431867
b  6    0.996895
   4    0.584551
c  5    0.883911
   8    0.049483
dtype: float64
# 選取
mser['a'][2]=0.936455
           

DataFrame 與 Series轉化

DataFrame -> Series : stack()

frame.stack()
           

Series -> DataFrame : unstack()

mser.unstack()
           

交換層級:

frame.colums.names=['a','b']
frame.index.name=['c','d']
frame.swaplevel('c','d')
frame.sortlevel('c')# 隻按照一個層級進行排序

# 按層級統計資料
frame.sum(level='c')
frame.sum(level='c',axis=1)
           

Pandas 資料讀寫

  • read_csv()
  • read_excel()
  • read_sql()
  • read_json()
  • read_html()
  • read_clipboard()

  • to_csv()
  • to_excel()
  • to_sql()
  • to_json()
  • to_html()
  • to_clipboard()

CSV 檔案

  1. read_table()
pd.csvframe=read_csv('data.csv')
pd.read_table('data.csv',sep=',')
# names 指定表頭
read_csv('data.csv',names=['id'])
# header 添加表頭
           

TxT RegExp 解析

在read_table中使用sep中的正規表達式
. 單個字元
\d 數字
\D 非數字
\s 空白字元
\S 非空白字元
\n 換行符
\t 制表符
>>> pd.read_table('tt.txt',sep='\s*')
   white  red  blue  green
0      1    5     2      3
1      2    7     8      5
2      3    3     6      7
>>> pd.read_table('tt.txt',sep='\D*',header=None)
 # skiprows=[1,3,6]排除1,3,6 行
 # skiprows=5 排除前五行
           

部分資料讀取(常用用法)

從 skiprows 開始讀,讀多少 nrows行

read_csv('data.csv',skiprows=[2],nrows=3,header=None)

解析文本:

out=pd.Series()
i=0
# chunksize 一次處理資料行數
pieces = pd.read_csv('tips.csv',chunksize=3)
for piece in pieces:
	out.set_value(i,piece['size'].sum())
	i=i+1
           

往CSV中寫資料

frame.to_csv('tt.csv',index=False,header=False)
           

替換,,中内容

frame.to_csv('new.csv',na_rep='NaN')

HTML

讀取HTML

安裝html5lib庫

conda install html5lib
           

tf=pd.DataFrame(np.arange(4).reshape(2,2))

print(tf.to_html()) # 自動轉化html

更加複雜的例子:(生成)

frame=pd.DataFrame(np.random.random((4,4)),index=['white','black','red','blue'],columns=['up','down','right','left'])

s=['<html>']
s.append('<head><title>DataFrame</title></head>')
s.append('<body>')
s.append(frame.to_html())
s.append('</body></html>')
html=''.join(s)

html_file=open('myFrame.html','w')
html_file.write(html)
html_file.close()
           

打開HTML檔案:

>>> web_frame=pd.read_html('myFrame.html')
>>> web_frame
[  Unnamed: 0        up      down     right      left
0      white  0.654247  0.917280  0.599515  0.401334
1      black  0.647599  0.555069  0.612985  0.279210
2        red  0.204044  0.719828  0.950169  0.749252
3       blue  0.089194  0.498193  0.568361  0.427534]
           

局限于讀表格

從XML讀取資料

lxml 庫檔案
from lxml import objectify
xml=objectify.parse('test.xml')
root=xml.getroot()
           

讀寫excel檔案

pd.read_excel('data.xlsx')
pd.read_excel('data.xlsx','sheet2')
           

代碼改變世界