numpy、pandas学习二
#numpy中arrary与pandas中series、DataFrame区别
#arrary生成数组,无索引、列名;series有索引,且仅能创建一维数组;DataFrame有索引、列名
import numpy as np
import pandas as pd
#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)) #左右分割
#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]) #输出第一、三、五行,第一列到第三列对应的数据
#行列标签、行列数混合筛选
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) #检查数据中是否存在空值,存在则返回True
#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)
# 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',key1、key2相同的,行数据合并
# how = ['left', 'right', 'outer', 'inner'] #outer时,按照key1、key2直接合并所有数据,包括left和right不同的key1、key2
res = pd.merge(left, right, on=['key1', 'key2'], how='left') #相当于左连接
print(res)
# 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 join
#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()
# 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()