写在前面,我也是一名python学习小白,从最近开始学习Python,由于之前没有编程基础,学习起来比较费劲,大部分时间都是从网上看写教学视频,一边学习,一边操作。但是大部分情况都是学完就忘,真正让自己写代码时,又总是依赖百度,进步很慢,最近也在通过学习Python的数据处理包-pandas,分享一些自己在实际学习过程中练习的一些代码,由于是类似比较,所以会有很多注释,帮助自己记忆的。【代码内容是可以直接复制到Pycharm中直接运行的】 ---如需转载,请注明出处,谢谢。
请关注我的知乎:Pandas学习总结
import pandas as pd
import numpy as np
第一部分:Pandas -Series数据处理
#pd.Series(data=list,index=[ ],name=”“) 创建:
#通过字典创建:
dic={"a":[1,2,3],"b":[4,5,6],"c":[7,8,9]}
s1 = pd.Series(data=dic,name="Random_num") #通过字典来创建Series,字典的Key为index(由于dict中key值不允许重复,所以不会有重复index),value为Series的value
#通过字典创建Series也可以指定index,如果指定的index与字典中key不一致,则会按照指定的index进行添加,value值会填充为NaN
#通过列表创建:
list1=[1,2,3,4]
s2 = pd.Series(data=list1,index=["a","e","f","g"],name="Random") #通过列表来创建Series,可以指定index(可以重复),如果不指定默认按0-整数作为index
#获取Series的name
s1.name
#获取Series的index
s1.index
#Series中增加数据:append(to_append,ignore_index=False) to_append为字典或Series,添加后不会改变原Series的内容。
#通过Series或dict来增加
s3 = s1.append(s2,ignore_index=True) #默认为False,添加什么就显示什么。 True表示为添加后的Series重新进行赋index值0-
s3 = s2.append(pd.Series({"h":45})) #其实括号中的字典已经被转换成Series再添加,所以append添加Series也是只能添加Series类型。
#向Series中添加other对象,add(other, level=None, fill_value=None, axis=0)
#使用add添加对象时,Series中必须为数字类型,否则会报错。
s2.add(5) #就是在s2中每个value值都增加5。
s4= s3.add(s2,fill_value=10) #如果两个Series有相同的index,那么相同的index的值会直接相加,不同的index会以fill_value指定的值填充。
#需要注意: fill_value=10 表示两个Series值进行相加时,如果index不匹配,会取两者的并集,没有的那个Series先讲值进行填充为指定fill_value值,然后再两者相加
#也就是说,两个不同长度的Series相加时,会先将两者的长度对其,缺失值填充NaN,然后再进行相加,NaN+数字 =NaN 所以也就能理解s4["d"]的值为55了。
#Series中数据的选择: get(key,default=None) 如果获取多个值,以列表的形式提供
s3.get("e") #之间通过index得到对应的值
s3.get(["a","e"],66) #如果index中没有值,则会输出指定的值default = 66
#Series中通过切片取值: 切片取值后的值仍为Series,如果是单个中就是value了。
type(s3[0])
s3[0:2]
# Series中相加运算。
#对于均为数字类型的Series,两Series进行相加时,相同的index会进行相加,不同的index按照NaN值进行填充。
#NaN属于float类型,表示缺失数据,可以参与运算。
s5 = s2+s3
# Series中缺失值操作
s1.notnull() #判断Series中是否存在缺失值,不是空值(也就是不为NaN)返回True,为空值(就是为NaN)返回False。
s5.isnull() #判断Series中是否存在空值,返回的时Series对象的布尔值。不为空,返回False,为空值,返回True。
#该操作可以在Series中对数据进行筛选操作,例如:
s5[s5.isnull()] #筛选出s5中为空值的行(数值),同样也适用在对DataFrame的操作中。
s5[s5.notnull()] #筛选出s5中不为空值的行(数值)。
#Series中缺失值的填充
s5.fillna(6) # 就是将s5中的NaN值填充为6
#Series中缺失值的删除
s5.dropna(inplace=True) #对于Series,直接就是删除NaN的值,返回的是删除NaN后的Series,但是原来的Series不会改变。
#如果指定了inplace = True 则原来的Series会改变,默认inplace=False
#Series中对数据的去重操作
s5.unique() #去除Series中的重复值,返回元素的唯一值。
s5.nunique() #返回s1的唯一值的个数,返回的是单个值。
s5.fillna(77)
#统计Series中值出现的次数
s5.value_counts() #统计Series中的值出现的次数。
#判断某值是否存在Series中
s5.isin([4,5,6,7]) #判断Series是否存在[4,5,6,7]这个列表中,返回对应的bool类型Series。
#对Series中数据按照值的顺序进行排序
s5.sort_values(ascending=False,inplace=False,na_position="last") #对于Series按照值排序不需要指定by 和axis 的值。
#对Series中按照索引的顺序进行排序
s5.sort_index(level=None,ascending=True,inplace=False,na_position="last") #对于Series参数axis是不需要的。by参数不建议使用。
# Series系列对象属性
# Series.inddex #返回Series的index对象
# Series.shape #返回Series的形状元组
# Series.dtype #返回Series的数据类型
# Series.size #返回Series的数据大小,数据的个数
# Series.ndim #返回数据中的维数
第二部分:Pandas - DataFrame数据处理
#pd.DataFrame的创建: pd.DataFrame(data= , index=[] ,columns=[],dtypes="int")
#通过字典进行创建
dict1 = {"a":[1,2,3],"b":[4,5,6],"c":[7,8,9],"d":[10,11,12]}
df = pd.DataFrame(data = dict1,index=[3,4,5],columns=["b","a","c","d"]) #通过dict进行创建DataFrame时,不需要指定columns,如果指定的columns值与dict的Key不一致时,会填充NaN的值。
#通过numpy创建
df1=pd.DataFrame(np.random.randint(3,8),columns=["a","b","c"],index=[1,2,3])
#通过读取csv/txt/excel文件进行创建 pd.read_excel("文件路径+文件名+扩展名",encoding ="gbk",index_col=0,skiprows=[1],header = None )
#index_col 指定行索引的列
#header 指定列索引的行,默认header = 0
#usecols 指定只使用那些列,默认为None,全部使用
#skiprows 指定跳过哪些行
#dtype #设置列的类型,一般可以通过字典来进行设置,如 dtype = {"列名":"类型"}
#sheet_name = 0 #表示读取excel中的哪张表,可以写表的名字,也可以写index索引,0代表第一张表,1代表第二张表
df3 = pd.read_csv(r"C:\Users\11764\Desktop\DataAnalyst.csv",encoding="gbk")
df3
#DataFrame属性:
df.columns #以index形式,返回df的列名称,因此可以通过修改列名,df.columns=list[] ,可以对列名进行修改
#还可以通过rename的方法对columns进行修改,df.rename(columns={"A":"B"},inplace = True) 将A列的名称更改为"B"
df.index #以index形式,返回df的索引
df.shape #返回df的形状(几行几列) df.shape[0] 返回df的行数 df.shape[1] 返回df的列数
df3.size #返回df的数据个数 几行*几列的值
df.values #以数组的形式,返回df的值
df.dtypes #以Series形式返回df的中每列数据的类型
df.ndim #以数字的形式返回df的维度
df.T # 将df进行转置,将数据的行变成列,将列变成行
df.info() #查看表中数据的类型
# DataFrame 数据选择
#df[] 默认是对列进行选择,如果需要选择对应行列中的值,需要先选择列,再选择行。即df["columns"]["index"] 否则会报错。 输入参数的位置是:先列后行
'''后续可以通过df["new_columns"]= list[] 来新增列。'''
df[1:5] #选取1:4行的数据
df["a"] #选择columns=3的列, df[] 只有一个参数是默认是选择列
df[["a","b"]] #选择的是不连续的两列
# df["b":"c"] #选择的是连续的列
df[1:3] #选择的是第2行到第3行的值,不包括第4行
df[:] #表示选择所有的行
df[:2] #表示选择前两行的值
df["a"][3] #表示选择"a" 列中对应的index=3 的值。 #建议在进行设置index值时,不要选择整型作为新的index,本来默认为整型,容易形成混淆。
# 此时的3 表示index值为3,与实际参数位置3有明显区别,也就是使用整型做index 的弊端。
#通过loc 和iloc 进行取值
#loc 是根据行列标签来进行选择. 需要取多列,将多列的标签放在列表[]中。 输入参数的位置是:先行后列
# df.loc[] 如果只有一个参数,默认是选择行的。 需要注意:与df[] 只有一个参数默认是选择列的。
df.loc[3] #选择index=3对应的行。
''' 后续可以通过df.loc["new_index"] = list[] ,该方式对DataFrame新增行。'''
df.loc[:] #表示选择所有的行
df.loc[3,"a"] #表示取index=3的行对应"a"列对应的值。
df.loc[:,"a"] #表示取"a" 列的所有值。
df.loc[3,:] # 表示取index=3 对应行的所有值。
#iloc 是根据行列的位置来进行取值的。 如果只有一个参数,则默认选择取行。 输入参数的位置是: 先行后列
df.iloc[2] #选择位置参数为2(对应第3行)的数据。
df.iloc[[1,2]] #表示选择第2行和第三行的数据。
df.iloc[1,2] #表示取第2行和第3列对应的数值
df.iloc[[1,2],[1,2]] #表示取第2行和第3行,对应的第2列和第3列的数据。
''''
数据选择总结:
df.loc[2],df.iloc[1] 只有一个参数表示是对行进行选择。
默认情况下 df[] 只能通过columns进行列选择,不能进行行选择,如果含有行号和区间,如df[:2] 是可以进行行选择。
df.columns 表示选择的columns这列,等价于 df["columns"]
'''
#DataFrame 数据的预处理-行列操作
#df.pop(item) #itme 指列标签,表示指定删除的列,并弹出删除列的值。不能作用于行
df.pop("a") #删除df中的对应的"a" 列,原df数据会被改变。
#df.get(key,default=None) key表示指定的列索引标签,如果df中有列索引,则返回该列的值,没有的话返回default的值。
df.get("b")
#df.insert(loc,column,value,allow_duplicates=False) 在df的指定位置插入一列。 不能作用于行。
''' loc 以int表示,表示插入列的位置,0
column 以str,number,object 表示插入列的标签
value 以int,Series,array-like 表示插入列的值
allow_duplicates 以bool类型表示,如果原df中有对应标签,True表示允许一样,False表示不能一样。'''
df.insert(2,"k",[15,13,17])
#对df中行或列数据进行排序。
# df.sort_values(by="" ,axis=0,ascending =True,inplace =False,na_position='last',ignore_index=False)
'''by="" 指定行索引名(“index”)或者列索引(“cloumns”),参数需要以列表[]的形式进行提供。
axis=0/1 若axis=0或"index"按照指定列中数据大小进行排序,若axis=1或"columns",则按照指定行索引中数据大小进行排序,默认axis=0
ascending=True/False 是否按照指定列进行升序排序,默认为True,即升序排列。
inplace=True/False 是否使用排序后的数据集更替原来的数据集,默认为False,即不替换。
na_position="frist" 或“last” 设置缺失值的显示位置。'''
df.sort_values(by=[3],axis=1) #表示按照index=3 对列进行排序,axis=1 表示跨行操作,也就是横向排序
df.sort_values(by=["b"],axis=0) #表示按照列名"a",对行进行排序,axis=0 表示跨列操作,也就是纵向排序
df["b"].sort_values() #表示的是对“a“ 列的数据进行值排序,返回的是"a" 列数据排序后的Series。
# 对df中的数据按照index进行排序
#sort_index(axis=0, level=None, ascending=True, inplace=False, kind='quicksort', na_position='last', sort_remaining=True, by=None)
'''
axis:0按照行名排序;1按照列名排序
level:默认None,否则按照给定的level顺序排列---貌似并不是,文档
ascending:默认True升序排列;False降序排列
inplace:默认False,否则排序之后的数据直接替换原来的数据框
kind:排序方法,{‘quicksort’, ‘mergesort’, ‘heapsort’}, default ‘quicksort’。似乎不用太关心。
na_position:缺失值默认排在最后{"first","last"}
by:按照某一列或几列数据进行排序,但是by参数貌似不建议使用
'''
df.sort_index(ascending=False) # axis 按照指定的行或列进行排序。
#对DataFrame中的数据设置索引值,也就是指定某一列作为列索引。
#df.set_index(keys,drop=True,append=False,inplace=False,verify_integrity=False)
'''
drop:默认为True,删除用作新索引的列
append:是否将附加到现有索引,默认为False ##通俗来讲,就是设置后的索引是否与原来的索引同时存在,True表示现索引和原索引同时并存
inplace:输入布尔值,表示当前操作是否对原数据进行修改,默认为False
verify_integrity :检查新索引副本。默认为False
'''
df.set_index("k")
#对df中将设置的索引回复到默认的索引值,与set_index 构成反向操作。
# df.reset_index(level=None,drop=False,inplace=False,col_level=0,col_fill=" ")
'''
将原来设置为索引的列进行还原,新的索引列默认填充,设置索引列的列回到df数据中,如果drop=True,则设置为索引列的列会被丢弃。
简单理解就是通过set_index 设置的df的index,现在又不想用了,可以直接df.reset_index(),又回到原来的默认值了
Level :当指定数值类型可以为int,str,tuple或list,默认为None(无)
Drop:当指定drop=False时,则索引列会被还原为普通列,否则为True时,经设置后的新索引值会被丢弃,默认为False。
inplace:True/False 表示当前操作是否对原数据生效,默认为False
Col_level :数值类型为int或str,默认值为0,如果列有多个级别,则确定将标签插入到哪个级别,默认情况下将插入到第一级。
Col_fill:对象,默认“ ”
'''
df.reset_index()
#将已有的df中的index或columns设置成自定义的index或columns,如果新设置的index或columns在原df中存在,会对原df进行且切片,否则会对应的值填充NaN值。
#df.reindex(labels=None,index=None,columns=None,axis=None,method=None,copy=None,level=None,fill_value=nan,limit=None,tolerance=None)
df.reindex(labels="a",index=[1,2,3]) #如果指定了index=[] ,就不需要再传入axis参数了。
#修改原df的index或columns名
'''
简单理解就是原来的df的index和column已经有了默认名称,现在我想重新修改名称,我可以只修改几个名称,或者觉得index或columns中有些名称不想要,
想改,可以通过字典形式进行映射修改,但是修改后的df的维度不会发生改变,不会像reindex那样可以新增或者切片。
但是rename修改名称时,index或columns需通过字典值映射。index={"原名":"新名"},columns={"原名":"新名"}
'''
df.rename(index={3:6},columns={"k":"g"}) #将df中的index索引3修改为6,将columns中"k"修改成"g"。
【内容持续更新...如果觉得对你有帮助,帮忙点个收藏和关注,谢谢!】