以下代码为我在学习《Python数据分析之pandas学习》是所敲的代码。原文章地址:Python数据分析之pandas学习
代码如下:
#-*- coding: UTF-8 -*-
'''
Python数据分析之pandas学习
博客地址:https://www.cnblogs.com/nxld/p/6058591.html
'''
import numpy as np
import pandas as pd
def main():
'''Series (1)通过一维数组创建序列
arry1=np.arange(10)
print(arry1)
print(type(arry1))
print("****")
s1=pd.Series(arry1)
print(arry1)
print(type(s1))
'''
'''Series (2)通过字典创建序列
dic1 = {'a': 10, 'b': 20, 'c': 30, 'd': 40, 'e': 50}
print(dic1)
print(type(dic1))
print("****")
s2=pd.Series(dic1)
print(s2)
print(type(s2))
'''
''' DataFrame (1)通过二维数组创建数据框
arrry2=np.array(np.arange(12).reshape(3,4)) #3行4列
print(arrry2)
print(type(arrry2))
print("****")
df1=pd.DataFrame(arrry2)
print(df1)
print(type(df1))
'''
'''
DataFrame (2)通过字典创建数据框、
dic2 = {'a': [1, 2, 3, 4], 'b': [5, 6, 7, 8],
'c': [9, 10, 11, 12], 'd': [13, 14, 15, 16]}
print("dic2\n%s"%dic2)
print(type(dic2))
df2=pd.DataFrame(dic2)
print("df2:\n%s"%df2)
print(type(df2))
print ("****")
dic3 = {'one': {'a': 1, 'b': 2, 'c': 3, 'd': 4}, #one teo three是列,a,b.c,d是行
'two': {'a': 5, 'b': 6, 'c': 7, 'd': 8},
'three': {'a': 9, 'b': 10, 'c': 11, 'd': 12}}
print("dic3:\n%s"%dic3)
df3=pd.DataFrame(dic3)
print("df3:\n%s"%df3)
print(type(df3))
'''
'''
DataFrame(2)通过数据框创建数据框、
df4=df3[['one','three']]
print("df4:\n%s"%df4)
s3=df3['one']
print("s3:\n%s"%s3)
'''
'''
数据索引:(1)通过数据索引获取值
s4 = pd.Series(np.array([1, 1, 2, 3, 5, 8]))
print("s4:\n%s"%s4)
print("s4的索引:\n%s"%s4.index)
s4.index=['a','b','c','d','e','f']
print("s4的索引:\n%s" % s4.index)
print("s4[4]:%s"%s4[4]+"\n") #这样也可以换行,字符串拼接
print("s4['c']:%s" % s4['c'] + "\n")
print("s4[:4]:\n%s" % s4[:4] + "\n") #取前4个
print("s4[4:]:\n%s" % s4[4:] + "\n") #从第五个开始取
print("s4[b:e]:\n%s" % s4['b':'e'] + "\n") # 从b到e包含b,e
'''
'''
#数据索引:(2)自动化对齐
#此处的s5和s6的索引是不一样的
s5 = pd.Series(np.array([10, 15, 20, 30, 55, 80]))
index=['a','b','c','d','e','f'] #此处可以不加s5.index,直接的index和s5.index效果一样
#print("s5的索引:\n%s"%s5.index)
s6= pd.Series(np.array([12,11,13,15,14,16]))
index = ['a','c','g','b','d','f']
#summ=s5+s6
print("s5+s6:\n%s"%(s5+s6)) #自动对齐分别相加,结果:[22,26,33,45,69,96]
print("s5/s6:\n%s"%(s5/s6))
'''
'''
利用pandas查询数据
'''
inputfile = 'G:\PythonCode\PycharmProjects\data\soccer.xlsx'
soccerData=pd.read_excel(inputfile)
#print(soccerData)
'''
查询指定行:
soccerData.head()默认为前5行,head()可以加参数,soccerData.head(6)为前6行
soccerData.tail()默认为后5行,tail()可以加参数,soccerData.tail(6)为后六行
print("查询前5行:\n%s"%soccerData.head())
print("查询后5行:\n%s" % soccerData.tail())
#通过ix索引标签查询指定的行
print("查询0,2,4行:\n%s"%soccerData.ix[[0,2,4]])#这里的ix索引标签函数必须是中括号[]
'''
'''
查询指定列
#print(soccerData['2006世界杯'].head(4))
print(soccerData[['2006世界杯','2010世界杯']].head(3))#如果多个列的话,必须使用双重中括号
#通过ix索引查询指定列
print(soccerData.ix[:,['2006世界杯','2010世界杯']].head(3))
#通过ix索引查询指定的行列
print(soccerData.ix[[0,3,5],['2006世界杯','2010世界杯']])
print(soccerData['2006世界杯']==50) #此出输出的是布尔值,true和false
print(soccerData[(soccerData['2006世界杯']==50) & (soccerData['2010世界杯']==50)]) #查询两列均为50的值
print(soccerData[(soccerData['2006世界杯']==50) & (soccerData['2010世界杯']==50)][['2007亚洲杯','2006世界杯']])
'''
'''
统计,主要是求均值,方差等等。此处没写公式
np.random.seed(1234) #每次产生一样的随机数
d1=pd.Series(np.random.normal(size=10)) #产生正太分布
d2=pd.Series(np.random.f(2,4,size=10)) #f分布
d3=np.random.randint(1,10,size=10) #随机整数
# print(d1)
# print("****")
# print(d2)
# print("****")
# print(d3)
df = pd.DataFrame(np.array([d1, d2, d3]).T, columns=['x1', 'x2', 'x3'])
#print(df.head())
# print(df.corr()) # pearson相关系数,默认的
# print(df.corr('kendall')) # Kendall Tau相关系数
# print(df.corr('spearman')) # spearman秩相关
#print(soccerData['2006世界杯'].describe()) #统计离散变量的观测数、唯一值个数、众数水平及个数。只需要使用describe方法就可以实现这样的统计了。
#print(df.corrwith(df['x1'])) #某一个变量与其余变量的相关系数的
#print(df.cov()) #数值型变量间的协方差矩阵
'''
'''
类似于SQL的操作
s1={'name':['liu','wang'],
'sex':['M','F'],
'age':[27,33],
'height':[165.7,167.2],
'wight':[61,63]
}
s2 = {'name': ['daniel', 'tony'],
'sex': ['M', 'F'],
'age': [12, 13],
'height': [156.7, 178.2],
'wight': [66, 66]
}
student1=pd.DataFrame(s1)
student2=pd.DataFrame(s2)
# print(student1)
# print(student2)
student3=pd.concat([student1,student2],ignore_index=True) #将student2中的数据添加到student1中,concat函数可以自动对齐两个数据框的变量!
#ignore_index=True,重新排行号
student3['score']=23 #增加一列,值都为23
#student3.drop(0,axis=0,inplace=True) #这样会删除所有行号为0的行,
#student3.drop('height',axis=1,inplace=True),#删除一列 height
#student3.drop(['age','wight'],axis=1,inplace=True) # 删除多列: age,wight
student3.ix[student3['name']=='tony','score']=98 #修改指定行列的值,就是修改原始记录
#print(student3)
#print(student3.groupby('sex').mean()) #groupby聚合, 根据sex列求均值
#print(student3.groupby(['sex','name']).mean())
#print(student3.drop('name',axis=1,inplace=True).groupby('sex').mean())#报错
#print(student3.drop('age',axis=1).groupby('sex').agg([np.mean(),np.median()])) #报错
sx=pd.Series(np.array(np.random.randint(1,20,10)))
#print(sx.sort_values()) #按值排序,默认升序
#print(sx.sort_index()) #按索引排序
#print(student3.sort_values(by='age')) #按年龄升序
#print(student3.sort_values(by=['age','sex'])) #按年龄和性别,此处年龄和性别谁在前面首先按谁排序
dic_score2={
'name':['daniel','tony','liu','wang'],
'score2':[83,84,np.nan,88], #此处有一个缺失值
'score3':[np.nan,70,73,50],
'score4':[90,92,94,np.nan]
}
score2=pd.DataFrame(dic_score2)
#print("score2:\n%s"%score2)
student4=pd.merge(student3,score2,on='name',how='right')
#print(student4)#两个表联合
#print(pd.isnull(score2)) #此处pd.isnull(score2)返回的是波尔类型的值,无法直接进行sum求和计算
#print(score2.dropna()) #删除缺失值,dropna会删除任何含有缺失值的行
#print(score2.dropna(how='all')) #只删除空行,就是这一个行的值都是nan
#print(score2.fillna(0)) #用常量填补缺失值
#print(score2.fillna(method='ffill')) #用前一个值填充,第一个前充不了,因为前面没有值
#print(score2.fillna(method='bfill')) # 用后一个值填充,最后一个填充不了
#用均值或中位数填充各自的列
score2_median=score2['score2'].median()
#print(score2_median)
score3_mean=score2['score3'].mean()
score4_mean=score2['score4'].mean()
scorex=score2.fillna({'score2':score2_median,
'score3':score3_mean,
'score4':score4_mean
})
#print("填充后的score2->scoreX:\n%s"%scorex)
studentx = pd.merge(student3, scorex, on='name', how='right')
print(studentx)
'''
'''
数据透视表,类似与excel
print(pd.pivot_table(studentx,values=['height'],columns=['sex']))
print("*****")
print(pd.pivot_table(studentx,values=['height','wight'],columns=['sex','age']).unstack()) #unstack():变成列联表
print("* * * * *")
print(pd.pivot_table(studentx,values=['height','wight'],columns=['sex'],aggfunc=[np.mean,np.median,np.std])) #此处的np.mean等函数不能写成np.mean()
'''
'''
多层索引的使用
'''
np.random.seed(1234)
dff=pd.DataFrame(np.random.randint(10,50,20).reshape(5,4),
index=[['A','A','A','B','B'],
[1,2,3,1,2]],
columns=[['X','X','X','Y'],
['x1','x2','x3','y']])
print(dff)
print("* * * * * * ")
print(dff['X']) #取出外层列索引为X的值,一大块数据
print("* * * * * * ")
print(dff.ix[['A'],:]) #取出外层行索引为A的值,一大块数据
if __name__ == "__main__":
main()