一.Series
1.索引,基础
s1=pd.Series(ar_list)
print(s1)
print(type(s1))
series里面放的一般都是列表,后面还可以设置内容的属性,类似于int64
np_rand=np.arange(1,6)
s1=pd.Series(np_rand,dtype='int64')
s1
接下来讲一下series中的索引
这里的index是自动设置的,根据列表的内容数量自动生成的从零开始索引
也可以通过list更直观的看索引
更改series数据的方式可以直接通过索引来改变,当用到表里没有的索引会自动添加一行进去,相同的则会更改数值
与前面所说的列表相对应的字典可以直接改变index的值
values方法可以直接知道具体的参数数值与属性
与前面一样都可以通过索引改变,获知数值
2.series运算以及基础方法
多个有相同数量,type的成员的series可以进行加减乘除
利用drop方法的时候可以通过索引删除series的成员,inplace默认为False,即原来的series对象不会改变,改变赋值的新对象,为True的时候则原对象直接被改变
利用pop方法不会改变原series对象的属性变量,但可以进行赋值
二.dataframe
1.基础
DataFrame跟Series区别在于区分data,columns(列名)
它也同样可以进行加减法
这里将series和dataframe结合在一起使用,其实series对象也可以直接用list来表示
dataframe更像是一张表,比series更注重格式,输出的时候也是行列相对,
这里运用的是也是索引查询方法
改变index,columns的方法有很多,这里讲一下rename方法
我们可以直接通过s.columns重新赋值来改变columns
也可以通过rename函数来重新赋值,区别在于这样写出来别人更容易看得懂过程
index也是这样,和columns一个操作方法
2.loc,iloc
loc一般运用于单个元素索引,索引对象都是里面的值
iloc则是通过序号索引,就是计算机01234的内置序号
这里使用的就是行列索引,通过bd的行确认后,再选择列two
iloc也是如此,但要记住【】【】不能少打了,用单个数值索引的时候要用两个括号
append方法可以增加数据
ignore_index默认为false,index不变,为true的时候序号就自动更换为01234这样
3.填充
向前填充就是像最后一位不是0的复制,向后填充则相反
三.处理表格数据
df=pd.read_excel("sales.xls")
print(df)
print("---------------------------")
print(df.info())#查看是否有缺失值
print("---------------------------")
print(df.isnull())
print("---------------------------")
print(df.notnull())
info方法可以查看是否有缺失值,有nan数据则显示true,没有则为false
isnull就是提取为空的数值
notnull和isnull相反,提取不为空的数值
df=pd.read_excel("sales.xls")
print(df)
print("---------------------------")
df["Milk"]=df["Milk"].fillna(0)#把缺失值变成0
print(df)
fillna方法和前面填充的方法很像,可以把nan数值填充为0,方便之后数据处理
duplicated方法是用来判断是否有重复值的,若显示为false则无重复值,
这里也用到了列索引open,可以单独看open这一列是否有重复值,
keep:删除重复项并保留第一次出现的项,取值可以为first、last、False,它们代表意义如下:
- first:从前向后查找,除了第一次出现外,其余相同的被标记为重复。默认为此选项。
- last:从后向前查找,除了最后一次出现外,其余相同的被标记为重复。
- False:所有相同的都标记为重复。
sortvalues方法可以通过选择标签的方法,根据某一列的数值来排序
例如第一个根据salary排序就是最后根据工资从小到大排序,后面根据name这个字符串形式则是根据字符长短来排序
这里也可以通过ascending的布尔值来确定要从大到小true的时候就是从小到大,false从大到小
fillna方法和前面fill_value方法作用一样,都是填充数据缺失值
数据的处理有许多,接下来讲一下mean,median,max,min,mode的用法
在算总成绩的时候,我们用sum需要判断是行还是列相加为我们要求的,于此来判断用axis为1还是0
在数据处理的时候我特地将英语一个值设置为空,以此来看最终结果,其他的medianmode方法不影响,平均值运算的时候会自动排除这个nan值来计算
方差的计算和标准差一样,一个用var一个用std,要注意的是pandas用的是无偏样本式方差
当需要用到排序,抽样的时候,单纯的从大到小不能很好地让我们抽取到精确地样本,
这里我们用到quantile分位数方法,可以以百分比的形式选取样本
时间
我们用quantile的时候,百分比也可以运用到时间,例如这里2020和2021的0.5就是这两年的中间的某一天,不过要注意用到Timestamp这种时间函数,不然不能识别
四.函数
匿名函数lambda
前面两个运用round方法,可以四舍五入控制小数的多少,后面首次运用了lambda方法,直接约束了小数点为2,f代表为浮点型
同样lambda函数也可以用来设置百分比,这里就是显示了A 列的小数用百分比来表示的结果
map,apply,applymap函数
apply函数通过axis控制行列,然后对一行一列进行改变
map函数只能应用在series每个元素上,对于要改变的是比较具体的
applymap函数是对dataframe整体元素产生效果
五.分组
groupby
groupby可以根据某列某行的标签,删除重复值
这里就是根据Name这一标签 ,来显示工资
data={'Name':['关羽','刘备','张飞','曹操','刘备','曹操','小乔','孙尚香','张飞'],'A':['a','a','a','b','b','b','c','c','c'],'Age':[28,34,29,42,100,28,27,56,45], 'salary':[5000,8000,10000,30000,123456,12345,23456,13456,46484]}
df=pd.DataFrame(data=data)
print(df)
print('---------------------')
df1=df[['Name','A','salary']]
df1=df1.groupby(['Name','A']).sum()
print(df1)
print('----------------')
print(df1.groupby('Name')['salary'].sum())
这里我特地重复了曹操的名字来表示出这个方法的排重功能,salary能看得出他将重复的相加并在一起
这里groupby根据多个标签进行分组,我把name和A标签的数值都设置有重复的,这样更能体现出group分组的特性
agg方法
在使用groupby方法后,还可以通过agg联系标签索引使用sum等数据处理方法
这里联系了之前所学的lambda匿名函数,让name下面那个本为nan空值的位置赋值为一个字符串,value_count方法就是输出这个值出现的次数
这是对之前的方法的实践
数据处理的时候有时候要进行全体的移位计算,例如销量差,总体的差距需要总体的移位计算
这里用的shift方法就可以进行往后移位,原来第一个的位置为空
根据csv文件通过逗号分割的原理,我们处理地址类数据也有类似的方法
这里就是根据空格来分割数据段,将市区道等分隔开依次使用
而对于一列分组来说
这里运用了apply函数,利用了series列表的兴致来进行分割
这里的join函数和apply相对应,也是通过apply函数,但可以进行组合合并
这里首先通过set_index
方法将班级序号提前,然后根据stack(堆栈)方法,将相同的一组合并在一起,形成几个小组
而unstack方法则可以分割小组
五.转化,合并
第一种是dataframe转化为字典,用了to_dict 方法,但要注意需要记住字典的索引和key关系来输出
第二第三种就是转化为列表和元组,列表没有差别太多,用了to_list
而元组的转化则不一样,需要记住元组的格式,记住tuple的使用方式
第一个就是因为都有编号所以合并,on表示相同的索引
第二个是将相同的索引分成xy两个,这里要注意需要同时rightleft写false或者true否则报错
除此之外还有外连接outter即不管有没有值都连接上,没有的用nan表示,内连接inner则相反,会删除无法对应的值
左连接和右链接要看写的顺序,然后根据leftright主导
多对一合并
多对一合并理论上也是跟前者一样找到相同的索引进行链接
多对多合并
多对多合并麻烦一些,两边列表都有多个元素对应对方表的一个索引
concat方法
concat方法首尾相连,要注意ignore_index为False的时候设置的keys起作用,反之就会变成012这样的索引
与杠杠的纵向表对应的横向表区别在于索引有不同的,数值也有不停,这里和前面的外连接内连接应用方法一样,内连接选用都可以对应上的数值链接,外连接则相反,多的就用nan表示
转化日期用to_datetime方法,可以将一些不是很规则的日期格式转化为计算机能分辨的格式
这里将年月日等时间分成不同的列表索引,在通过datetime方法合并为正常日期格式
注意被datetime方法处理过的数据就可以根据年月日来提取了,但一定要用year,month这些方法来提取
date_range 方法类比于range方法,可以输出好几个相同间断的时间
这里用到了热sample方法来设置自定义的时间间断,用rule来限制间断时常,3t就是3分钟,也可以用h表示小时等等
这里用到了W,根据星期也就是七天七天分隔,可以看到他是根据始末两天然后中间划分间断日期数据是为0的
升采样就是防止刚刚中间都为0的情况,可以对此前置填充赋值
我们在研究股票开盘的时候,需要研究open,close,high,low这些值
这里介绍ohlc方法
直接看看不太出来,通过输出s后我们可以看到他分成5分钟后,每五分钟来看最高值最低值,比如第一份在开盘和最低值都是0,而第五分钟就是序列四达到高峰4,这也是收盘价
对于数据的分析处理还有rolling方法,这里rolling方法运用的是均值处理,设定为3天一次均值,而min_periods要是不设置的话前两天的值都会为空,因为默认为3,设定为1后就能灵活的取均值,如图中所示。rolling还可以计算sum等其他方法
六.导出
这是普通excel表的导出
#导出到多sheet表
df=pd.DataFrame({
'编号':['msb1001','msb1002','msb1003'],
'姓名':['张三','李四','王五'],
'总成绩':[740,658,543]
})
#打开一个excel文件
work=pd.ExcelWriter('数据导出多sheet表.xlsx')
df.to_excel(work,sheet_name='学生成绩信息')#导出到名称为学生成绩信息的sheet表
df[['姓名','总成绩']].to_excel(work,'成绩表',index=False)
#保存到工作簿
work.save()
导出到多sheet表的时候需要确认好sheet的名字,这里的work就是表的内容,‘成绩表’就是多出来的sheet名字
csv文件也是差不多的方法,但注意这里可以跟上面一样,选择部分索引列表导出
最后就是导出到html了
df=pd.read_excel('数据导出.xlsx')
df.to_html('数据导出.html',header=True,index=False)
header表示需要有台头,index为false所以这里的index是自然形成的012索引