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类似

 

posted @ 2020-12-24 14:29  呱呱、、  阅读(243)  评论(0编辑  收藏  举报