numpy、pandas学习

numpy、pandas学习
本文主要是此前学习莫烦python的笔记,及个人的部分修改与注释,特发此博与大家分享。
此为莫凡python学习链接:https://morvanzhou.github.io/tutorials/data-manipulation/np-pd/

#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()

你可能感兴趣的:(numpy、pandas学习)