pandas

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

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息