python之pandas学习
pandas中的series的建立
- 先说说series ,series由numpy建立,如下;
#series的建立
##通过numpy的一维数组建立
se = Series(np.array([1,2,3,4]))
print("通过numpy的一维数组建立\n",se)
##通过列表直接建立 优选
se = Series([1,2,3,4])
print("通过numpy的一维列表建立\n",se)
print("输出se的值:",se.values)
print("输出se的索引:",se.index)
print("输出se的数据类型:",se.dtype)
##通过字典创建
dd = {'甲':1,"乙":2,"丙":3,"丁":4}
se = Series(dd)
print("通过字典来创建se:\n",se)
结果如下:
2.series索引,series索引和列表索引相似,如下所示:
#对series的index索引进行赋值
se = Series([1,2,3,4])
print("对index进行赋值之前:\n",se)
se = Series([1,2,3,4],index=['甲','乙','丙','丁'])
print("对index进行赋值之后:\n",se)
se.index = ['A','B',"C","D"]
print("对index进行修改之后:\n",se)
结果如下:
3.给series赋值name属性
#给series赋值name属性
se = Series([1,2,3,4],index=['甲','乙','丙','丁'])
se.name = "编号"
se
结果如下:
写一个例子帮助理解,如下所示
#题目 1、创建一个series index是 宝马 奔驰 凯迪拉克 奥迪 value随便
# 2、再把 index改成 宝马3系 奔驰c级,凯迪拉克 CT5 奥迪 a4
# 3、并赋值 name为 汽车售价
se = Series([1,2,3,4],index=['宝马','奔驰', '凯迪拉克', '奥迪'])
print(se)
se.index = ['宝马3系', '奔驰c级','凯迪拉克 CT5', '奥迪 a4']
print(se)
se.name = '售价'
print(se)
结果如图:
4.pandas最常用的两个属性,用于检查数据
#常见使用的属性
se.head(2) #查看头2行的元素
se.tail(2) #查看末尾2行的元素
5.Series的索引以及series的基础运算
se = Series([329000,270000,279000,260000],index=['宝马','奔驰', '凯迪拉克', '奥迪'])
se.name = "2020年4s店售价"
print(se)
print("查看宝马的价格(直接根据索引):",se['宝马'])
print("查看宝马的价格(根据下标查看):",se[0])
#根据索引取切片基本上不用
print("查看从宝马到凯迪拉克的价格(直接根据索引)根据索引时,左闭右闭:\n",se['宝马':'凯迪拉克'])
print("查看从宝马到凯迪拉克的价格(直接根据下标)根据下标时,左闭右开:\n",se[0:2])
索引的结果如下:
#当series等长时,元素根据索引一一计算
se1 = Series([-1,-2,3,4])
se2 = Series([2,3,4,5])
se1+se2
se1-se2
se1*se2
se1/se2
se1/10
np.sqrt(se1)
np.abs(se1)
计算结果如下:
#Series自动对齐
#当series不等长时,索引相同的一一计算,索引不同的为NaN值,运算存在容错性,如果是array就会报错
se1 = Series([1,2,3])
se2 = Series([2,3,4,5])
se1+se2
#证明我们上面的结论,也是series是根据索引来计算的。
#实验:两个series,元素个数相同,但是索引不同
se1 = Series([1,2,3,4],index=['a','b','c','d'])
se2 = Series([2,3,4,5],index=['e','a','d','q'])
print(se1)
print(se2)
se1+se2
#证明完毕,结论正确
输出结果如图:
6.缺失值的检测与替换
#缺失值检测
se = Series([1,2,3,np.NaN])
#isnull判断是否有缺失值
print("isnull的结果:\n",se.isnull())
#notnull判断是否无缺失值
print("notnull的结果:\n",se.notnull())
#缺失值的替换
print("se缺失值替换前:\n",se)
se[se.isnull()] = 0
print("se缺失值替换后:\n",se)
结果如下:
pandas中的DataFrame的建立
1.多种方式建立DataFrame后面简称df
#通过二维数组或者列表建立dataframe
arr = np.array([
[1,2,3],
[2,3,4]
])
df = DataFrame(arr, index=['a','b'], columns=['q','w','e'])
print("通过数组建立的df:\n",df)
ls = [
[1,2,3],
[2,3,4]
]
DataFrame(ls, index=['a','b'], columns=['q','w','e'])
print("通过列表建立的df:\n",df)
#通过字典建立df
dd = {'a':[1,2,3],'b':[2,3,4],"c":[5,6,7]}
df = DataFrame(dd)
print("通过字典建立的df:\n",df)
结果如下
2.df的索引 使用df[]进行索引时,必须使用索引的名字, 而且只能索引列!!!
dd = {'a':[1,2,3],'b':[2,3,4],"c":[5,6,7]}
df = DataFrame(dd,index=['r','g','b'])
df['a']
结果:
如果想进行行索引时,需通过loc[‘行索引名’],或者使用**iloc[int,int]**进行索引,ix方法已被版本弃用
print("使用索引名时:\n",df.loc['r'])
print("使用数值直接索引时(iloc):\n",df.iloc[0,:])
type(df.loc['r'])
结果如下:
df实例
df = pd.DataFrame({
'a':[1,2,3,4,5,6],
'b':[2,3,4,5,6,7],
'c':[3,4,5,6,7,8]
},index=['q','w','e','r','t','y'])
#提示:方式是:[] loc iloc 转化为array之后再取
#1、索引 a这一列 w这一行 尝试使用更多不同的方法,可以多个函数,可以转化为array
a = df['a'] #索引列,最简单好用的方法
w = df.loc['w'] #索引行,如果有行标签,最简单的方法
w = df.iloc[1,:] #索引行,如果没有行标签,最简单的方法,正常来说,没有行标签的数据极大多数
# a = df.iloc[:,0]
#2、索引所有的 4 5 尝试使用更多不同的方法,可以多个函数,可以转化为array
# 5 6
df.iloc[2:4,1:] #同时索引行和列最常用的方式,没有行标签的情况下
df.loc['e':'r','b':'c'] ##同时索引行和列,有行标签的情况下
#3、把表中所有的2都换成0
df[df==2] = 0
#4、说说自己觉得哪个索引方式最好用
#正常数据表情况下
#单独索引列用 df['列名']
#有行有列,或者索引单行情况下,df.iloc[]
pandas的基本功能(这里不一一列举)
1.pandas的文件读取
read_path = "./student.txt"
df= pd.read_csv(read_path,header=None,sep='~',names=['uid','name','score','txt'])
print(df)
#1/特性1 默认第一行数据是列名,通过header这个参数控制,设置header=None可以取消第一行变列名
#2/特性2 要根据文件的分隔符来读取文件,分隔符通过sep这个参数来控制,默认是逗号
#3/在处理和写入文件的时候,最不可能重复的分隔符一般是 \t
#4/特性3 可以通过names参数对文件的列名进行赋值
read_path = "./student.txt"该文件如下:
2.pandas文件写入
write_path = "./student_write.txt"
#pandas的文件写入
#做个处理,删除 备注这一列,并新加一列得分的平均值
#删除一列或者一行 最常用的函数是 drop([要扔的列名],axis=0按行,axis=1按列, inplace是否直接替换原始数据)
df1 = df.drop(['txt'],axis=1)
#新加一列
df1['avg'] = df1['score'].mean()
#写入文本文件
df1.to_csv(write_path,index=None,header=None,sep="\t")
#to_csv特性
#1、默认写入的时候会把行索引也写进去,不影响pandas读取,但是会影响其他读取,一般不要
#因此,通过控制index参数来取消写入
#2、跟read-csv一样,也有header和sep参数,来控制是否写入列索引和分隔符
pandas里缺失值处理
先创建一个df
df = pd.DataFrame({
'a':[np.NaN,2,3],
'b':[1,np.NaN,2],
'c':[np.NaN,2,3]
})
对缺失值处理,为了方便阅读,全部放在代码里面,外面不写过多注释
#dropna 对缺失值进行行删除或者列删除操作
#1、how参数控制删除缺失值的方法 all:当一列或者一行全都是缺失值的时候删除 any
#2、axis通过行删还是列删, 默认axis=0时,删除行, axis=1时删除列
df = df.dropna(how='all',axis=0) #特征工程中用的非常多
#axis=0用的多 默认
#how='any'用的多,懒人模式,后面不需要做缺失值填充
#how='all'认真去做的话,后面需要做缺失值的填充
#fillna 缺失值的填充
#1、直接选择填充一个具体的值
df.fillna(0)
#2、向前填充,向后填充
df.fillna(method="ffill")
df.fillna(method="bfill")
pandas里的常见统计方法
1.统计方法
df = DataFrame({
'a':[1,2,3,4,5.0],
'b':[2,3,4,5,6.2],
'c':[3,4,5,6,7]
})
#基础的信息展示
print(df.info())
#基础的统计展示
print(df.describe())
print("每列的最大值:\n",df.max())
print("每列最大值的索引位(pandas的方式):\n",df.idxmax(axis=0))
print("每列最大值的索引位(numpy的方式):\n",df.values.argmax(axis=0))
结果如下:
2.相关系数和协方差
#相关系数全称 皮尔逊相关系数:表示两个数据之间的线性相关程度
#计算协方差
#直接在整个df上计算,得到协方差矩阵
print(df.cov())
#单独拿出来两列做协方差
df['a'].cov(df['b'])
结果如下:
相关系数的极端
#直接在df上计算得出相关系数矩阵
df.corr()
#单独拿出来做
df['a'].corr(df['b'])
# 结果 = 0.99926117463131425