pandas引入約定數組
from pandas import Series,DataFrame import pandas as pd
Series:一種相似於一維數組的對象,是由一組數據(各類NumPy數據類型)以及一組與之相關的數據標籤(即索引)組成。僅由一組數據也可產生簡單的Series對象。注意:Series中的索引值是能夠重複的,至關於豎着的數組數據結構
經過一維數組建立app
arr=np.array([1,3,5,np.NaN,10])
ser01=Series(arr)
print(ser01)
print(ser01.index)#打印索引
print(ser01.values)#打印值
結果:函數
0 1.0
1 3.0
2 5.0
3 NaN
4 10.0
dtype: float64
RangeIndex(start=0, stop=5, step=1)
[ 1. 3. 5. nan 10.]ui
經過字典建立spa
dict={ 'name':'xxd', 'age':26, 'sex':'W' } ser01=Series(dict) print(ser01)
結果:code
age 26
name xxd
sex W對象
指定索引:默認索引是0-n-1blog
ser01=Series([87,90,89])
ser01.index=['語文','數學','英語']#第一種方式
ser02=Series(data=[99,89,88],dtype=np.float32,index=['語文','數學','英語'])#第二種方式
print(ser01)
print(ser02)
結果:排序
語文 87
數學 90
英語 89
dtype: int64
語文 99.0
數學 89.0
英語 88.0
dtype: float32
修改索引:原本就有的數據不變,沒有的值爲空就是NaN
ser01=Series([87,90,89]) ser01.index=['語文','數學','英語'] print('修改前的數據:') print(ser01) new_index=['數學','英語','Chinese','Math','English'] ser02=Series(ser01,index=new_index) print() print('修改後的數據') print(ser02)
結果:
修改前的數據:
語文 87
數學 90
英語 89
dtype: int64
修改後的數據
數學 90.0
英語 89.0
Chinese NaN
Math NaN
English NaN
dtype: float64
Series值的獲取:numpy中絕大多數操做均可以在Series中使用
ser01=Series({ '20170801':5, '20170802':4, '20170803':3, '20170804':-1, }) print(ser01) print() print(ser01[ser01>3]) print() print(ser01/1000) print() print(np.exp(ser01)) print() print(np.fabs(ser01))
結果:
20170801 5
20170802 4
20170803 3
20170804 -1
dtype: int64
20170801 5
20170802 4
dtype: int64
20170801 0.005
20170802 0.004
20170803 0.003
20170804 -0.001
dtype: float64
20170801 148.413159
20170802 54.598150
20170803 20.085537
20170804 0.367879
dtype: float64
20170801 5.0
20170802 4.0
20170803 3.0
20170804 1.0
dtype: float64
isnull和notnull函數:返回bool值,isnull判斷是否爲空,notnull判斷是否不爲空
ser=({ 'Jack':45, 'Tom':34 }) new_index=['Jack','Curry','Jad','Tom'] ser=Series(ser,index=new_index) print('原始數據:') print(ser) print() print('找出空數據:') print(pd.isnull(ser)) print() print('找不有數據的bool值:') print(pd.notnull(ser)) print() print('找出空數據的項:') print(ser[pd.isnull(ser)]) print() print('找出不是空數據的項:') print(ser[pd.notnull(ser)])
原始數據:
Jack 45.0
Curry NaN
Jad NaN
Tom 34.0
dtype: float64
找出空數據:
Jack False
Curry True
Jad True
Tom False
dtype: bool
找不有數據的bool值:
Jack True
Curry False
Jad False
Tom True
dtype: bool
找出空數據的項:
Curry NaN
Jad NaN
dtype: float64
找出不是空數據的項:
Jack 45.0
Tom 34.0
dtype: float64
Series自動對齊:當多個series對象之間進行運算的時候,若是不一樣series之間具備不一樣的索引值,那麼運算會自動對齊不一樣索引值的數據,若是某個series沒有某個索引值,那麼最終結果會賦值爲NaN
ser01=Series([1,2,3,4],index=['p1','p2','p3','p4']) ser02=Series([2,3,4,5],index=['p2','p3','p4','p5']) print(ser01+ser02)
p1 NaN
p2 4.0
p3 6.0
p4 8.0
p5 NaN
dtype: float64
Series及其索引的name屬性:Series對象自己以及索引都具備一個name屬性,默認爲空,根據須要能夠進行賦值操做
ser=Series({ 'Tom':87, 'Jack':99, 'Curry':100 }) ser.name='語文成績' ser.index.name='姓名' print(ser)
姓名
Curry 100
Jack 99
Tom 87
Name: 語文成績, dtype: int64
DataFrame:一個表格型的數據結構,包含有一組有序的列,每列能夠是不一樣的值類型(數值、字符串、布爾型等),DataFrame即有行索引也有列索引,能夠被看作是由Series組成的字典
DataFrame經過二維數組建立
#方式一: # df01=DataFrame([['Tom','Gerry','John'],[76,98,65]]) # print(df01) # print('-'*20) #方式二: # arr=np.array([ # ['Tom',76], # ['Gerry',98], # ['John',65] # ]) # df02=DataFrame(arr,index=['one','two','three'],columns=['name','score']) # print(df02) # print(df02.index) # print(df02.columns) # print(df02.values) # print('-'*20) #經過字典的方式建立 #順序是按照字母順序排的 #只有一個值的代表全部列都是這個數據 # data={ # 'apart':['101','102','103','101'], # 'profiits':[587.1,125.2,12.2,23.5], # 'year':[2001,2005,2010,2015], # 'month':8 # } # df03=DataFrame(data) # df03.index=['one','two','three','four']#重置行索引 # print(df03) # print('-'*20) ''' DataFrame數據獲取 df[列名]:獲取列 df.ix[行名]:獲取行 ''' # data={ # 'apart':['101','102','103','101'], # 'profiits':[587.1,125.2,12.2,23.5], # 'year':[2001,2005,2010,2015], # 'month':8 # } # df=DataFrame(data) # df.index=['one','two','three','four'] # print(df['year']) # print(df.ix['two']) # df['month']=[5,6,7,8]#修改值 # df['pdn']=np.NAN#新增列 # df.ix['five']=np.NAN#新增行 # print(df) ''' pandas:數據文件讀取 ''' # #讀取csv文件 # df=pd.read_csv('data1.csv') # print(df) # #讀取文本數據 # #指定屬性分隔符爲':',不讀取頭部數據 # df01=pd.read_csv('data3.txt',sep=':',header=None) # print(df01) # #將df轉換存儲到data4csv中 # df.to_csv('data4.csv') # #將df轉換存儲到data5.txt中 # df.to_csv('data5.txt',sep=':',header=None) ''' 數據過濾獲取 ''' # df=pd.read_csv('data3.txt',sep=':',header=None) # columns=['name','age','chinese','math','English'] # df.columns=columns # print(df) # print(df[columns[2:]])#讀取第二列及之後列的數據 #print(df) ''' 缺省值NaN處理方法 ''' # df=DataFrame([ # ['Tom',np.NAN,456.67,'M'], # ['Merry',34,345.56,np.NAN], # ['Gerry',np.NAN,np.NAN,np.NAN], # ['John',23,np.nan,'M'], # ['Joe',18,385.12,'F'] # ],columns=['name','age','salary','gender']) # print(df) # print(df.isnull())#返回布爾值類型 # print(df.notnull())#返回布爾值類型 # #默認丟棄只要包含缺失值的行 # # how='all'全爲缺失值纔去掉若爲any表示有一個就去掉 # #axis=1按列去掉 # print(df.dropna(how='any',axis=1)) # #將缺失值所有填充爲0 # print(df.fillna(0)) # #將指定列填充成指定數字 # print(df.fillna({'name':0.5,'age':-1,3:1})) ''' pandas:經常使用的數學統計方法 ''' # df=pd.read_csv('data3.txt',sep=':',header=None) # columns=['name','age','語文','數學','英語'] # df.columns=columns # df=df[columns[2:]] # print(df) # #查看df的統計信息 # print(df.describe()) ''' 協方差:若是有x,y兩個變量,每一個時刻的「X值與其均值之差」乘以「Y值與其均值之差」獲得一個乘積 ,再對這每時刻的乘積求和並求出均值。 若是協方差爲正,說明X,Y同向變化,協方差越大說明同向程度越高,不然... 相關係數差很少就是多除以一個標準差 ''' # df=pd.DataFrame({ # 'GDP':[900,1000,1100,1200,1300], # 'foreign_trade':[300,400,500,550,600], # 'year':['2012','2013','2014','2015','2016'] # }) # #交互求協方差 # print(df.cov()) # #指定求協方差 # print(df['GDP'].cov(df['foreign_trade'])) # #交互求相關係數 # print(df.corr()) # #指定求相關係數 # print(df['GDP'].corr(df['foreign_trade'])) ''' 惟一值、值計數以及成員資格 ''' ser=Series(['a','b','c','d','a','b']) print(ser) #對ser進行去重操做 print(ser.unique()) #值計數,ascending=False就是倒敘排 print(ser.value_counts()) #查看b c在不在裏面,在的話打印出來 mask=ser.isin(['b','c']) print(ser[mask]) df=DataFrame({ 'ordef_id':['1001','1002','1003','1004','1005'], 'member_id':['m01','m01','m02','m01','m01'], 'order_amt':[345,312.2,123,250.2,235] }) #只能對Series進行去重,不能直接對DataFrame去重 print(df['member_id'].unique())
層次索引
data=pd.Series([100,200,122,150,180], index=[ ['2016','2016','2016','2017','2017'], ['蘋果','香蕉','西瓜','蘋果','西瓜'] ]) print(data) print(data['2016']) print(data[:,'西瓜'])
2016 蘋果 100
香蕉 200
西瓜 122
2017 蘋果 150
西瓜 180
dtype: int64
蘋果 100
香蕉 200
西瓜 122
dtype: int64
2016 122
2017 180
dtype: int64
交換分層索引
data01=data.swaplevel() print(data01) data02=data.swaplevel().sort_index()#sort_index()能夠自動進行排序 print(data02)
蘋果 2016 100
香蕉 2016 200
西瓜 2016 122
蘋果 2017 150
西瓜 2017 180
dtype: int64
蘋果 2016 100
2017 150
西瓜 2016 122
2017 180
香蕉 2016 200
dtype: int64
轉變爲DataFrame索引的堆:level等於幾,那一列就消失在列裏變爲一行
data1=data.unstack(level=1) print(data1)
蘋果 西瓜 香蕉
2016 100.0 122.0 200.0
2017 150.0 180.0 NaN
變回去的形式
data2=data1.stack(level=0) print(data2)
2016 蘋果 100.0
西瓜 122.0
香蕉 200.0
2017 蘋果 150.0
西瓜 180.0
dtype: float64
指定索引
df=DataFrame({ 'year':[2001,2001,2002,2002,2003], 'fruit':['apple','banana','apple','banana','apple'], 'production':[2345,3124,5668,2532,2135], 'profits':[233.44,4452.2,1225.2,7845.2,2352.2] }) print(df) df=df.set_index(['year','fruit']) print(df)
print(df.ix[2001,'apple'])#進行索引
fruit production profits year
0 apple 2345 233.44 2001
1 banana 3124 4452.20 2001
2 apple 5668 1225.20 2002
3 banana 2532 7845.20 2002
4 apple 2135 2352.20 2003
production profits
year fruit
2001 apple 2345 233.44
banana 3124 4452.20
2002 apple 5668 1225.20
banana 2532 7845.20
2003 apple 2135 2352.20
production 2345.00
profits 233.44
Name: (2001, apple), dtype: float64
進行統計
print(df.sum(level='year'))#進行統計 print(df.mean(level='fruit')) print(df.min(level=['year','fruit']))
year 2001 5469 4685.642002 8200 9070.402003 2135 2352.20 production profitsfruit apple 3382.666667 1270.28banana 2828.000000 6148.70 production profitsyear fruit 2001 apple 2345 233.44 banana 3124 4452.202002 apple 5668 1225.20 banana 2532 7845.202003 apple 2135 2352.20