- 常用数据结构
- List,tuple,dir,series,dataframe
- 区别:list可修改,tuple不可修改
- 操作:pop弹出最后一个元素;alist.append([5,6,7])在最后直接加上;alist.extend([5,6,7]) 把元素打开后添加到list里面去。
- I/O数据的导入导出
- do=pd.read_csv("country_facts.csv"),一般只推荐read_csv,因为从EXCEL里面读取数据容易出错,excel转换成csv或者txt再进行读文件。excel读取: pandas.read_excel()不推荐。
- 一般步骤:
Pwd #查看当前文件夹;
df=pd.read_csv();
df.head() #查看前几行,默认为五行;
type(df) #查看当前类型,例如这个是dataframe数据框,最前面的列是索引(重要!) ,每一列的数据类型都是相同的,各自列数据类型相互独立。 Series如果取出第一列df['fips'],这个是series,可以理解为一个dataframe是由不同的series组成的;
df.loc(0) #取一行,type(df.loc[0])也是一个series ,(索引变成了行的字符串);Series为一维数据,DataFrame为二维数据。
- 处理数据保存到本地:DataFrame.to_csv(),df.to_csv("df1.csv")
- 为什么读取的数据是乱码的?(尤其是读取中文的时候)
解决方法:设置参数encoding="gbk",error_bad_lines=False;或者文件转换为utf-8;或者使用python3。
- 字典的创建
- adir={'a':1,'b':2}
- pd.series(adir,name="shujufenxi") #字典被转换为series ,key为索引。
- Pd.DataFrame(adir,index=[0]) #时候'a' 'b'变成了列的第一行名称,dataframe必须要传入索引,否则会报错。
- Pd.DataFrame.from_dict(adir,orient="index") #这时候'a' 'b'变为索引,orient为方向。
- Missing value
- 一般针对数值型的,如果是文本型的可以用空格替代,不太重要。
例如:df1=pd.read_csv("df.csv",error_bad_line=False,encoding="gbk")#设置成False后可以在读到missing value之后不会停止而是继续读下去,这里encoding的设置是在报错的时候尝试这样解决。
- 检查:df1.isnull(), df.notnull # 一般来说missingvalue是数值型,字符型不能用数字替换(没有意义)。
替换:df.fillna(0) #用0替换missing value,但一般来说没有意义。
删除:df.dropna() # 整个样本都会被删掉,不推荐。
- 索引的选取:
- dataframe与series的属性:方法是动态的有(),方法是静态的无括号 #df.index为属性,无括号, index=df.index,
df.T为转置,df.shape查看行列数目,不包括索引。
- 选取行:df[1;5]
列选取:选取某一列
df["fips"] #选取一列 , df[["a","b"]]推荐使用这种,不推荐使用df.class
df["class"]=None #给df增加一列,值为none
- rename重命名:
df.rename??
df.rename(columns={"class":"label"}).head() #"class"变为"label",但是返回的是新的数据集,原始数据并不发生变化。 df.rename(columns={"class":"label"},inplace=True) #取代,对原有的数据进行修改。
df.drop??
df.drop("label",axis=1,inplace=True) #在列上面进行删除,轴设置为1。
df['area_name'].value_counts() #计算频次:把某一列的元素出现的次数统计出来。
- 索引选取:
- loc常用,用在选取索引名称,但在选取索引的位置时使用ilox。
df.loc:
df.loc[1:4] #不是前闭后开(凑巧这里索引是数字)
df[1:4] #前闭后开
df.iloc[1:4] #前闭后开
df.set_index? #将某一列设置为索引
dfnew=df.set_index("are_name")
dfnew.loc[1:4] #找不到索引,loc是对索引名称进行切片
dfnew.loc["Alabama"] #跟“”有关的所有样本会被选出来
df.iloc[1:4] #可以找到索引,但是对字符串是绝对不可以的,是对索引的位置进行选择,不是对名称
dfnew.loc["Barbour",["fips","state"]]#逗号前面是对索引操作,逗号后面是对列进行操作,在这里所有只能用名称进行操作
dfnew.iloc[1:4,:2] #只能用数字操作不能用名称,传统的切片。
#creat a label ,when area_name==US,label=1 else label=0
代码:
df.loc[df['area_name']=="unite states"] #将索引位上True的位置选取出来
df.loc[df['area_name']=="unite states","label"]=1 #label列赋值为1
df.loc[df['area_name']!=="unite states","label"]=0
#PST>==100000 AND PST04>=100000 labelp=1 else labelp=0
Df,loc[(df['PST']>=100000)&(df['PST']>=100000),'labelp']=1 #运算优先级,括号里先运算
Df,loc[~((df['PST']>=100000)&(df['PST']>=100000)),'labelp']=0 #加括号和波浪号~:取这个条件的全部的反面
- df.ix[1:4,['fips']] #可以混合选取索引名称和位置,df.ix[1:4]为闭区间,但是需要判别是选取索引名称还是索引位置,是要消耗运行的,所以推荐loc和iloc。
- df.query("PST">=100000&pst04>=100000) #运行的时候要注意优先级,字符串作比较的时候用单引号'',只能在当前的语句使用; 不能使用引用变量值
- 多重索引:
- 前处理:
movie=pd.read_csv("movie_metadata.csv")
movie.dtypes #每一列的属性
movie["movietitle"]=movie["movie_title"].map(lambdas:s.stripe("")) #处理空格
movie.head()
- 双重索引:
movie.set_index(['director_name','duration'],drop=False,append=False,inpalce=True)
#drop作用于列,append作用于索引,inplace取代原来变量,原来的索引就不存在了,使这两个字符串作为索引
Index=movie.index #索引赋值
len(index)
Index.get_leveal_values(1) #设置了两个索引,只有0层和1层索引,所以这里括号内只能为0,1
movie.loc['Avatar'] #在第0个level上进行的操作,不行?
movie.swapelevel(0,1) #交换leverl方法
movie.sort_index(inplace=True)#对数据进行排序,这个是对索引按照alphabet进行排序
slice()选取 slice(1,100)索引的值的范围选取出来
movie.loc[(slice(None),"Avatar"),:] #第0个level不进行slice,不管什么都选取出来;第1个level只选取'Avater'的行(多个元素选取使用列表或者切片) ,最后的:表示对所有列选取或者选取特定列(用列表表示),多重索引必须指定列,这是和loc单重索引的区别。
Idx.pd.IndexSlice
movie.loc[ ( ["james","jon"] , slice (100,200) ), "movie_title" ]=1 #这里可以创建新变量比如"movie_title"=1,但是不能使用~()
- PS:关于括号,方括号为列表,圆括号代表函数、tupe