Python——pandas基本方法
1.pandas创建及基本操作
dates = pd.date_range('20200928',periods = 6) #periods = 6 表示生成6个数据,data_range表示日期类型数据 print(dates) '------pd.DataFrame()------生成DataFrame格式的数据----括号内可传入矩阵格式和字典格式的数据---' df = pd.DataFrame(np.random.randn(6,4),index = dates,columns = ['a','b','c','d']) print(df) #通过index 设置行的索引值,column设置列的索引值 df1 = pd.DataFrame(np.arange(12).reshape((3,4))) #默认行和列的索引值为从0开始的自然数 print(df1) df2 = pd.DataFrame({'A':1, 'B':pd.Timestamp('20200928'), 'C':pd.Series(1,index = list(range(4)),dtype = 'float32'), 'D':np.array([3]*4,dtype = 'int32'), 'E':pd.Categorical(['test','train','test','train']), 'F':'foo'}) print(df2) '---dtypes---返回每一列的数据类型--------' print(df2.dtypes) '---index---返回行索引值------' print(df2.index) '---column---返回列索引值-----' print(df2.columns) #可以对其进行赋值改变列索引 '重新设置索引值,索引为0,1....' df1=df.reset_index() '---values---返回DataFrame数据每一行的值-----' print(df2.values) '---describe--描述每一列数据---只能描述数字类型的数据---' print(df2.describe) '----T---对DataFrame数据进行类似矩阵的转置-----' print(df2.T)
2.DataFrame行、列索引基本操作
'----sort_index()----对DataFrame、Series按索引进行排序---' df.sort_index(axis = 1,ascending = False,by = 'A') #通过axis设置对行或队列进行排序(axis = 1表示对列进行,axis = 0 表示对行进行索引),通过ascending设置正序或倒序,ascending = False表示倒序,A表示某一列 s.sort_index()) #s为Series数据 '----sort_values()--对DataFrame按值进行排序-----' print(df.sort_values(by = 'E')) #通过by 设置对那一列进行按值排序 '-----修改列名-----' df.columns = ['A','B'] #列名以列表形式传入 df.rename(columns = {'a':'A'},inplace=True) '-----修改索引名----' df.index.name = 'A' df.index.names = ['A'] df.index.set_name = 'A' df.index.set_name = ['A'] '----------------重新设置索引-------------------' df.reset_index(drop = True,inplace = True) #drop删除原来的索引,默认为False 即原索引成为新的一列 #inplace原始对象更改 ,默认为False 即原始对象不变 返回一个新对象 df = df.set_index('A') #设置A列为索引,原索引会被删掉,可通过df = df.reset_index().set_index('state')保留原索引 '-----------------增加索引--------------------' df.reindex(columns = None,index = None) #调整索引columns可传入值 new_columns = df.columns.insert(4,'D') #new_columns为 Index类型数据,与上一句搭配可实现列索引的修改
3.pandas选择数据
'---通过下标或索引获取值---两种形式---------' print(df.A,df['A']) print(df[0:3],df['20200928':'20200930']) '----loc后缀选择数据---' print(df.loc['20200929']) #df.loc['20200929]['A']选择某个值 print(df.loc[:,['A','B']]) #打印A,B两列所有行的数据,(或者通过df.loc['20200928',['A','B']]打印某行的某几列) #通过 .loc方式选择列时,只能通过上面的方法,前面带一个 :且列名以列表的形式传入 '------------------通过iloc选择数据------通过位置选择列-------' '选择行' df.iloc[2] #只有一个参数,那么默认是行 df.iloc[[0,2]] #以列表形式 第0和2行 df.iloc[1:2] #以切片形式 第一行(左闭右开) df.iloc[lambda x: x.index == 'A'] #索引名为A的所有行 '选择列' df.iloc[;,1] #返回第一列 Series格式数据 df.iloc[:,1:3] #返回第一二列 DataFrame 数据格式 df.ilox[:,[1,3]] #返回第一、三列,DataFrame格式 '----通过位置下表选择数据---------' print(df.loc[3,1]) #返回DataFrame数据中的第三行第一列的数据 print(df.loc[3:5,1:3]) #返回DataFrame数据中第三行到第五行,第一列到第三列的数据,或者通过df.loc[[1,3,5],[1:3]]不连续的选择某几行的一到三列 '----通过ix后缀 进行行索引和列索引混合选择数据----' print(df.ix[:3,['A','B']]) #返回前三行,列索引为‘A'和’B'的数据 '---通过判断方式(<, >, ==)进行索引----' print(df[df.A > 8]) #返回A列中,数值大于8的数据(df.A锁定A列)
4.pandas设置值
#----------------------------------------------pandas设置值----------------------------------------------------------------------- # dates = pd.date_range('20130101',periods = 6) # df = pd.DataFrame(np.arange(24).reshape(6,4),index = dates,columns = ['A','B','C','D']) # print(df) #---通过下标改值---- # df.iloc[2,2] = 1111 # print(df) #---通过索引该值----- # df.loc['20130103','B'] = 22 #---通过判断方式锁定位置进行改值----- # df[df.A > 4] = 0 #此方法会将A列中大于0的数的所在行的所有数据改为0,因为此方法是锁定所有列 # print(df) # df.A[df.A > 4] = 0 #此方法只将A列中的数据改为0,此方法是锁定A列(df.A) # print(df) #---DataFrame数据中增加列--- # df['F'] = np.nan # df['E'] = pd.Series([1,2,3,4,5,6],index = pd.date_range('20130101',periods = 6)) # print(df)
5.pandas丢失数据处理
'------df.dropna(axis = 0或1 ,how = 'any'或'all')----删除缺失数据所在行或列---' print(df.dropna(axis = 0 ,how = 'any')) #axis = 0表示删除行,axis = 1表示删除列,how = any表示只要此行(列)有一个NAN就删除此行(列), how = all表示此行(列)所有数据都是NAN才删除此行(列)print '------df.fillna(value = )----填充缺失数据----------------' print(df.fillna(value = 0)) #将缺失的数据赋值为0 '------df.isnull()----依次判断每个位置是否是缺失值---返回布尔值---------' print(df.isnull()) print(np.any(df.isnull()) == True) #判断整个矩阵是否有缺失值,返回布尔值
6.pandas多个表合并
df1 = pd.DataFrame(np.ones((3,4))*0,columns = ['a','b','c','d']) df2 = pd.DataFrame(np.ones((3,4))*1,columns = ['a','b','c','d']) df3 = pd.DataFrame(np.ones((3,4))*2,columns = ['a','b','c','d']) #此三个数据表头相同 '-------pd.concat()---横向或纵向合并数据---------------------------------------------------------------------' res = pd.concat([df1,df2,df3],axis = 0,ignore_index = True) #ignore_index = True,表示忽略索引,重新进行排列,否则合并后索引为0 1 2 0 1 2...... #axis = 0 表示按行合并,axis = 1表示按列合并, 默认axis= 0 #---------concat的join参数------- df1 = pd.DataFrame(np.ones((3,4))*0,columns = ['a','b','c','d'],index = [1,2,3]) df2 = pd.DataFrame(np.ones((3,4))*1,columns = ['b','c','d','e'],index = [2,3,4]) res = pd.concat([df1,df2],join = 'inner',ignore_index = True) #此段程序合并的数据表头不一样,若按照默认方式(join = outer)合并会形成五列,没有数据的部分以NAN表示 #此时设置join = inner ,会将相同的部分合并,即合并后数据只有三列(b,c,d) #---------join_axes------- df1 = pd.DataFrame(np.ones((3,4))*0,columns = ['a','b','c','d'],index = [1,2,3]) df2 = pd.DataFrame(np.ones((3,4))*1,columns = ['b','c','d','e'],index = [2,3,4]) res = pd.concat([df1,df2],axis = 1,join_axes = [df1.index]) #join_axes = [df1.index] 表示按照df1的索引进行数据间的列合并,df2中没有索引为1的那一列数据显示为NAN #若不设置此参数,会取两者索引的并集,即合并后的数据包含四行,缺失的数据用NAN表示 print(res) '-----------------df1.append()方法追加数据------------(append方法不是合并数据,而是往一个里面追加其他是数据,但并不改变源数据)--------' df1 = pd.DataFrame(np.ones((3,4))*0,columns = ['a','b','c','d'],index = [1,2,3]) df2 = pd.DataFrame(np.ones((3,4))*1,columns = ['a','b','c','d'],index = [2,3,4]) res1 = df1.append(df2,ignore_index = True) print(res1) #此时df1没有改变,通过参数axis = 1可设置为横向追加数据 #可以同时追加多个 df3 = pd.DataFrame(np.ones((3,4))*2,columns = ['a','b','c','d'],index = [2,3,4]) res2 = df1.append([df2,df3],ignore_index = True) print(res2) #追加单个数据 s1 = pd.Series([1,2,3,4],index = ['a','b','c','d']) #pd.Series 的作用是将数据标准化 print(s1) res3 = df1.append(s1,ignore_index = True) print(res3) '-----------------------------------------------------------merge方法进行数据合并---------------------------------------------------------' left= pd.DataFrame({'key':['K0','K1','k2','K3'], #键作为表头,值作为数据 'A':['A0','A1','A2','A3'], 'B':['A0','A1','A2','A3']}) right = pd.DataFrame({'key':['K0','K1','K2','K3'], 'C':['C0','C1','C2','C3'], 'D':['D0','D1','D2','D3']}) #-----pd.merge()-默认方法的数据合并------ res = pd.merge(left,right,on = 'key') #on = 'key' 表示基于 key 这一列进行合并 #---pd.merge()进行数据的合并----on、how参数------- left= pd.DataFrame({'key1':['K0','K1','k2','K3','K4'], 'key2':['K0','K1','K2','K3','K4'], 'A':['A0','A1','A2','A3','A4'], 'B':['A0','A1','A2','A3','A4']}) right = pd.DataFrame({'key1':['K0','K1','K2','K3'], 'key2':['K0','K1','K2','K3'], 'C':['C0','C1','C2','C3'], 'D':['D0','D1','D2','D3']}) res = left.shape[0] res = pd.merge(left,right,on = ['key1','key2'],how = 'inner') #给参数 on 传入一个字典,会基于字典内包含的列进行合并 #how 可传入参数包括'inner','outer','right','left' #-----------通过merge中的index参数进行合并----- left = pd.DataFrame({'A':['A0','A1','A2'], 'B':['B0','B1','B2']}, index = ['K0','K1','K2']) right = pd.DataFrame({'C':['C0','C1','C2'], 'D':['D0','D1','D2']}, index = ['K0','K2','K3']) #根据两个DataFrame的索引进行合并(left_index = True,right_index = True 其功能类似于 on ),并取并集(how = 'outer') res = pd.merge(left,right,left_index = True,right_index = True,how = 'outer') #-------merge中的suffixes参数------ boys= pd.DataFrame({'k':['K0','K1','K2'],'age':[1,2,3]}) girls= pd.DataFrame({'k':['K0','K0','K3'],'age':[4,5,6]}) res = pd.merge(boys,girls,on = 'k',suffixes = ['_boys','_girls'],how = 'inner') #dsuffixes = ['_boys','_girls'],为表头设置后缀名,若不设置,会自动填充_x,_y
6.Series数据基本操作
'--------------修改列名-------------' s.index.name = 'A' '---------------修改对象名---------' s.name = 'a' '----------合并两个series数据------' 'concat' S = pd.concat([s1, s2], axis=1, keys=["s1", "s2"]) 'append' S = s1.append(s2) '------Series转换为DataFrame-------' '单个Series转换' df = {'A':series.index,'B':series.values} '多个Series转换' df = pd.DataFrame({'A':a,'B':b,'C':c}) '选择数据' #与DataFrame类似