#numpy中arrary與pandas中series、DataFrame區別
#arrary生成數組,無索引、列名;series有索引,且僅能建立一維數組;DataFrame有索引、列名
import numpy as np
import pandas as pdsql
#numpy基本用法
print(np.array([1,2,3,"a"])) #建立並打印一維數組
#a=np.array([1,2,3,"a"])
#print(a.shape,a.size) #a.shape打印數組的行數、列數,a.size打印數組的元素個數
print(np.array([[1,2,3],[4,5,6],[7,8,9]])) #建立並打印二維數組
print(np.array([x for x in range(1,10)],dtype=np.int32)) #dtype用於設置元素類型
print(np.array([x for x in range(1,10)]).reshape((3,3))) #reshape用於設置矩陣的行列數
print(np.arange(10,20,2)) #建立10至20的步長爲2的序列
print(np.arange(12).reshape((3,4))) #建立從0-12(不包含12)的三行四列的矩陣
#b=np.arange(10,20,2)
#print(b<15) #返回[ True True True False False]
'''
np.linspace(1,10,20)) #將1-10平均分爲20個數字,並生成序列
np.linspace(1,10,8).reshape((2,4)))
np.zeros((3,4)) #生成三行四列的0矩陣
np.ones((3,4),dtype=np.int32) #生成三行四列的元素均爲1的矩陣
np.empty((3,4))
'''
#numpy中矩陣乘法
a1=np.arange(12).reshape((3,4))
print(a1*2) #a1中每一個元素都乘以2
print(a1**2) #a1中每一個元素都進行平方
b1=np.arange(4)
print(a1*b1) #用b1去分別乘a1的每一行
#真正的矩陣乘法
a2=np.arange(4).reshape(2,2)
b2=np.array([[1,0],[0,1]])
np.dot(a2,b2) #兩個矩陣相乘
a2.dot(b2) #兩個矩陣相乘的另外一種表達方式
'''
np.sum(a2)
np.max(a2)
np.sum(a2,axis=1) #按行求和,若=0,則爲按’列數求和;sum、min、mean用法相同數組
np.argmin(a2) #返回最小值的索引,0
np.argmax(a2) #返回最大值的索引,3
np.diff((a2)) #矩陣中每兩個元素的差(按行)
'''
A=np.arange(14,2,-1).reshape((3,4))
print(A)
print(np.sort(A)) #按行進行升序排列每行元素
print(np.transpose(A)) #矩陣轉置
print((A.T).dot(A))
print(np.clip(A,5,9)) #矩陣中全部小於5的數都改成5,全部大於9的數都改成9
A[2] #第二行的全部數
A[2][1]
A[2,1]
A[2,:] #第二行的全部數
A[:,1] #第一列的全部數
A[1,1:2] #第一行的第1-2元素
A.flatten() #將矩陣抹平爲一個序列
for item in A.flat: #A.flat爲一個迭代器
print(item)
#合併
a3=np.array([1,1,2])
b3=np.array([2,2,3])
print(np.vstack((a3,b3))) #上下合併兩個矩陣
print(np.hstack((a3,b3))) #左右合併,
print(a3.T.shape) #返回(3,),a3.T不能實現把橫向的數列轉化爲列數列
print(a3[np.newaxis,:].shape) #返回(1,3)
a3=a3[:,np.newaxis] #=np.array([1,1,2])[:,np.newaxis]
b3=b3[:,np.newaxis] #=np.array([2,2,3])[:,np.newaxis]
print(np.hstack((a3,b3)))
print(np.concatenate((a3,b3,a3,b3),axis=1)) #左右合併,若axis=0則爲上下合併
#分割
a4=np.arange(12).reshape((3,4))
print(np.split(a4,2,axis=1)) #split(數據,分爲幾部分,按什麼方向分),按列分爲2部分
print(np.split(a4,3,axis=0)) #按行分爲3部分
print(np.array_split(a4,3,axis=1)) #不等分分割
print(np.vsplit(a4,3)) #上下分割
print(np.hsplit(a4,2)) #左右分割app
#pandas基本用法
m = pd.Series([1,2,3,4])
indexs = pd.date_range('20180101',periods=6)
print(indexs)
print(pd.DataFrame(np.random.randn(6,4),index=indexs,columns=['a','b','c','d']))
print(pd.DataFrame(np.arange(12).reshape((3,4))))
print(pd.DataFrame({"2018001":"zhang san","2018002":"li si","2018003":list(["wanger","sangsi","wangwu"])})) #用字典來建立DataFrame,其中"2018001"等爲列名
m1=pd.DataFrame({"2018001":"zhang san","2018002":"li si","2018003":list(["wanger","sangsi","wangwu"])})
#m1.dtypes m1.columns m1.describe()
m1.sort_index(axis=1,ascending=False) #axis=1表示對column排序,axis=0表示對index排序;ascending=False表示倒序,爲True時表示正序
m1.sort_values(by="2018001") #對2018001這一列排序
df=pd.DataFrame(np.arange(24).reshape((6,4)),index=indexs,columns=['a','b','c','d'])
print(df['a'],df.a) #兩個輸出結果相同,均是輸出a列的值
print(df[0:3],df['20180102':'20180104']) #0-3index的數據,兩個輸出結果相同
#按行列標籤篩選
print(df.loc['20180102']) #輸出20180102行
print(df.loc[:,['a','b']]) #輸出a,b兩列
print(df.loc['20180102',['a','b']]) #輸出'20180102'這一行的a,b兩列數據
#按行列數範圍篩選
print(df.iloc[3,1]) #輸出第三行、第一列的數據
print(df.iloc[3:5,1:3]) #輸出第三行到第五行,第一列到第三列對應的數據
print(df.iloc[[1,3,5],1:3]) #輸出第1、3、五行,第一列到第三列對應的數據
#行列標籤、行列數混合篩選
print(df.ix[:3,['a','c']]) #輸出前三行,a、c列對應的數據
#篩選包括擴展區域的數據
print(df[df.a>8]) #篩選a列中大於8的全部列的值
print(df.a[df.a>4]) #篩選a列種大於4的全部a列的值
print(df.b[df.a>4])
#df['f']=np.nan #增長f列並賦空值non
#df['e']=pd.Series([1,2,3,4,45,6],index=pd.date_range('20180101',periods=6))
df.iloc[0,1]=np.nan
df.iloc[1,2]=np.nan
print(df)
print(df.dropna(axis=0,how='any')) #刪除存在空值的行,若how='all'則是刪除全爲空值的某行(即那一行均爲空值);axis=1時同理
print(df.fillna(value=0)) #將空值部分填充爲0
df.isnull() #找出空值部分
np.any(df.isnull()==True) #檢查數據中是否存在空值,存在則返回Truedom
#data=pd.read_csv('文件名.csv') #pandas導入文件
#data.to_pickle('文件名.pickle') #pandas保存文件
#concat
df1=pd.DataFrame(np.ones((3,4))*0,columns=['a','b','c','d'])
df2=pd.DataFrame(np.ones((3,4))*1,columns=['a','b','c','d'])
df3=pd.DataFrame(np.ones((3,4))*2,columns=['a','b','c','d'])
print(pd.concat([df1,df2,df3],axis=0,ignore_index=True)) #將df1,df2,df3上下合併,並從新排序索引
#join,[inner,outer]
df4=pd.DataFrame(np.ones((3,4))*0,columns=['a','b','c','d'],index=[1,2,3])
df5=pd.DataFrame(np.ones((3,4))*1,columns=['b','c','d','e'],index=[2,3,4])
pd.concat([df4,df5]) #df4,df5相互沒有列的數據以non填充
pd.concat([df4,df5],join='inner') #相同列部分保留合併,join='outer'時,爲默認格式,與pd.concat([df4,df5])相同
pd.concat([df4,df5],join='inner',ignore_index=True)
pd.concat([df4,df5],axis=1) #至關於sql的全鏈接
pd.concat([df4,df5],axis=1,join_axes=[df4.index]) #至關於sql的左鏈接
df4.append(df5,ignore_index=True)
df4.append([df5,df5],ignore_index=True)
s1=pd.Series([1,2,3,4],index=['a','b','c','d'])
print(df4.append(s1,ignore_index=True))
# merging two df by key/keys. (may be used in database),按關鍵列合併,該列不必定在數據的哪一邊,由於這次舉例均採用字典形式
# simple example
left = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']})
right = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']})
print(left)
print(right)
res = pd.merge(left, right, on='key') #安裝key進行合併
print(res)ide
# consider two keys
left = pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K2'],
'key2': ['K0', 'K1', 'K0', 'K1'],
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']})
right = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'],
'key2': ['K0', 'K0', 'K0', 'K0'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']})
print(left)
print(right)
res = pd.merge(left, right, on=['key1', 'key2'], how='inner') # default for how='inner',key一、key2相同的,行數據合併
# how = ['left', 'right', 'outer', 'inner'] #outer時,按照key一、key2直接合並全部數據,包括left和right不一樣的key一、key2
res = pd.merge(left, right, on=['key1', 'key2'], how='left') #至關於左鏈接
print(res)spa
# indicator
df1 = pd.DataFrame({'col1':[0,1], 'col_left':['a','b']})
df2 = pd.DataFrame({'col1':[1,2,2],'col_right':[2,2,2]})
print(df1)
print(df2)
res = pd.merge(df1, df2, on='col1', how='outer', indicator=True) #增長一列_merge用來顯示merge狀況
# give the indicator a custom name
res = pd.merge(df1, df2, on='col1', how='outer', indicator='indicator_column') #增長一列indicator_column用來顯示merge狀況(如left_only)排序
# merged by index
left = pd.DataFrame({'A': ['A0', 'A1', 'A2'],'B': ['B0', 'B1', 'B2']},index=['K0', 'K1', 'K2'])
right = pd.DataFrame({'C': ['C0', 'C2', 'C3'],'D': ['D0', 'D2', 'D3']},index=['K0', 'K2', 'K3'])
print(left)
print(right)
# left_index and right_index,left_index默認爲nan,這裏將其改成用index合併
res = pd.merge(left, right, left_index=True, right_index=True, how='outer')
res = pd.merge(left, right, left_index=True, right_index=True, how='inner')索引
# handle overlapping,suffixes添加後綴
boys = pd.DataFrame({'k': ['K0', 'K1', 'K2'], 'age': [1, 2, 3]})
girls = pd.DataFrame({'k': ['K0', 'K0', 'K3'], 'age': [4, 5, 6]})
res = pd.merge(boys, girls, on='k', suffixes=['_boy', '_girl'], how='inner') #區別k相同,對應不一樣數據的歸屬(age_boy、age_girl)
print(res)
res = pd.merge(boys, girls, on='k', suffixes=['_boy', '_girl'], how='outer')
# join function in pandas is similar with merge. If know merge, you will understand joinip
#pandas plot
import matplotlib.pyplot as plt
# plot data
# Series
data = pd.Series(np.random.randn(1000), index=np.arange(1000))
data = data.cumsum()
##data.plot()pandas
# DataFrame
data = pd.DataFrame(np.random.randn(1000, 4), index=np.arange(1000), columns=list("ABCD"))
data = data.cumsum()
# plot methods:
# 'bar', 'hist', 'box', 'kde', 'area', scatter', hexbin', 'pie'
ax = data.plot.scatter(x='A', y='B', color='DarkBlue', label="Class 1") #scatter只能有兩個屬性
data.plot.scatter(x='A', y='C', color='LightGreen', label='Class 2', ax=ax) #ax=ax將此圖與ax圖打印到一張圖中
plt.show()