数据追加df.append
df.append() 的基本语法:
df.append(self,other,ignore_index=False,verify_integrity=False,sort=False)
- other:调用方法要追加的DataFrame或类似序列的内容。
- ignore_index:如果是True,则重新进行自然索引
- verify_integrity:如果为True,则遇到重复索引内容时报错
- sort:进行排序
相同结构
直接使用第一个DataFrame的append方法,出入第二个DataFrame。如果需要追加多个DataFrame,可以将它们组成一个列表再传入。
df1 = pd.DataFrame({'x':[1,2],'y':[3,4]})
df2 = pd.DataFrame({'x':[5,6],'y':[7,8]})
df1.append(df2) # 返回一个新的DataFrame
df.append([df2,df3,df,4]) # 追加多个
不同结构
不存在的列会被增加,内容为NaN
df3 = pd.DataFrame({'y':[5,6],'z':[7,8]})
df1.append(df3)
追加序列
append() 除追加DataFrame外,还可以追加一个Series、字典
lily = pd.Series(['lily','c',55,56,57,58],index=['name','team','Q1','Q2','Q3','Q4'])
df = df.append(lily,ignore_index=True)
df = df.append({'name':'lily','team':'c','Q1':55,'Q2':56,'Q3':57,'Q4':58},ignore_index=True)# 同上
数据连接 pd.concat
pd.concat()的基本语法:
pd.concat(objs,axis=0,join='outer',ignore_index=False,
keys=None,levels=None,names=None,sort=False,
verify_integrity=False,copy=True)
- objs:需要连接的数据,可以是多个DataFrame或者Series。必传参数
- axis:连接的轴方向,默认是0,即按列连接,追加在行后面。值为1时追加到列后面。
- join:合并方式,其他轴上的数据是按照交集(inner)还是并集(outer)进行合并
- ignore_index:是否保留远来的索引
- keys:连接关系
- names:索引名称,包括多层索引
- verify_integrity:是否检查重复内容
- copy:如果为False,则不要深拷贝
## 按列连接
如果要将多个DataFrame按列拼接在一起,指定axis=1。索引无法对应的位置上将填充NaN
df2 = pd.DataFrame({'x':[5,6,7],'y':[7,8,9]})
pd.concat([df1,df2],axis=1)
合并交集
指定参数join=‘inner’,取两个DataFrame的公共部分
# 按列合并交集
pd.concat([df1,df2],axis=1,join='inner')
与序列合并
如同df.append()一样,DataFrame也可以用concat方法与Series合并
z = pd.Series([9,9],name='z')
# 将序列加到新列
pd.concat([df1,z],axis=1)
# 增加新列 效果同上
df1.assign(z=z)
指定索引
可以再给每个表一个一级索引,形成多层索引,这样可以清晰地看到合成后的数据分别来自哪个DataFrame
# 指定索引名
pd.concat([df1,df2],keys=['a','b'])
# 以字典形式传入
pieces = {'a':df1,'b':df2}
pd.concat(pieces)
# 横向合并,指定索引
pd.concat([df1,df2],keys=['a','b'],axis=1)
## 多文件合并
使用python的官方库glob来识别目录文件
import glob
files = glob.glob('data/*.xlsx')
cols = ['ID','时间','名称']
dflist = [pd.read_excel(i,usecols=cols) for i in files]
df = pd.concat(dflist)
df = pd.concat(map(pd.read_excel,glob.glob('data/*.xlsx')))
使用内置函数map进行操作
pd.concat(map(pd.read_csv,['data/d1.csv',
'data/d2.csv',
'data/d3.csv',]))
pd.concat(map(pd.read_excel,['data/d1.xlsx',
'data/d2.xlsx',
'data/d3.xlsx',]))
数据合并pd.merge
可以实现类似SQL的join操作,功能更全,性能更优
pd.merge()的基本语法
pd.merge(left,right,how='inner',on=None,left_on=None,right_no=None,
left_index=False,right_index=False,sort=True,
suffixes=('_x','_y'),copy=True,indicator=False,
validate=None) # 返回一个DataFrame
- left、right:需要连接的两个DataFrame或者Series,一左一右
- how:两个数据连接方式,默认inner,可以设置为inner、outer、left或right。
- on:作为连接键的字段,左右数据中都必须存在,否则需要使用left_on和right_on来指定
- left_index,right_index:为True时,将索引作为连接键
- suffixes:如果左右数据有重复列,新数据表头会用此后缀进行区分
连接键
在数据连接时,如果没指定哪一列(连接键)进行连接,Pandas会自动找到相同的列名作为连接键。为了代码的可读性和严谨性,推荐通过on参数指定连接键。
df1 = pd.DataFrame({'a':[1,2],'x':[5,6]})
df2 = pd.DataFrame({'a':[2,1,0],'y':[6,7,8]})
pd.merge(df1,df2,on='a')
## 索引连接
可以直接按索引进行连接,将left_index和right_index设置为True,会以两个表的索引作为连接键
pd.merge(df1,df2,left_index=True,right_index=True,suffixes=('_1','_2'))
多连接键
如果在合并数据时需要用多个连接键,可以以列表的形式将这些连接键传入on中
df3 = pd.DataFrame({'a':[1,2],'b':[3,4],'x':[5,6],'z':[10,11]})
df4 = pd.DataFrame({'a':[2,1,0],'b':[3,4,5],'y':[6,7,8]})
pd.merge(df3,df4,on=['a','b'])
连接方法
how参数可以指定数据用哪种方法进行合并,可以设置为inner、outer、left或right,可以实现类似SQL的join操作。
- inner:取交集
- left:保留左表所有数据(行)
- right:保留右表所有数据(行)
- outer:保留全部数据,对应不上的填充NaN
pd.merge(df3,df4,on=['a','b'],how='left')
pd.merge(df3,df4,on=['a','b'],how='right')
pd.merge(df3,df4,on=['a','b'],how='outer')
连接指示
将indicator设置为True,则会增加名为_merge的列,显示这列是从何而来。_merge列有三个取值:
- left_only:只在左表
- right_only:只在右表
- both:两个表中都有
pd.merge(df3,df4,on='a',how='outer',indicator=True)
按元素合并
df.combine_first()
使用相同位置的值更新空元素,只有在df1有空元素时才能替换值。如果结构不一致,所得DataFrame的行索引和列索引将是两者的并集
df1 = pd.DataFrame({'A':[None,1],'B':[None,2]})
df2 = pd.DataFrame({'A':[3,3],'B':[4,4]})
df1.combine_first(df2)
df3 = pd.DataFrame({'A':[3,3],'C':[4,4]},index=[1,2])
df1.combine_first(df3)
df.combine()
可以与另外一个DataFrame进行按列组合。使用函数通过计算将一个DataFrame与其他DataFrame合并,以逐元素方式合并。所得DataFrame的行、列索引是两者的并集。这个函数中的两个参数,分别是两个df中对应的Series,计算后返回一个Series或者标量
df1=pd.DataFrame({'A':[1,2],'B':[3,4]})
df2=pd.DataFrame({'A':[0,3],'B':[2,1]})
# 合并,方法为:s1和s2对应位置上哪个值大,就返回哪个值
df1.combine(df2,lambda s1,s2:np.where(s1>s2,s1,s2))
df.update
利用update()方法,可以使用来自另一个DataFrame的非NaN值来修改DataFrame,而原DataFrame被更新
df1 = pd.DataFrame({'a':[None,2],'b':[5,6]})
df2 = pd.DataFrame({'a':[0,2],'b':[None,7]})
df1.update(df2)
df1 # 查看结果
数据对比df.compare
在DataFrame上使用compare()传入对比的DataFrame可以进行数据对比(只能对比结构相同的数据)
df1 = pd.DataFrame({'a':[1,2],'b':[5,6]})
df2 = pd.DataFrame({'a':[0,2],'b':[5,7]})
# 对比数据
df1.compare(df2) # 显示数据之间的差异,如果数据没有差异,则显示为NaN
df2 = pd.DataFrame({'a':[1,2],'b':[5,7]})
df1.compare(df2) # a列数据不显示,因为都有相同
传入参数 align_axis=0,可以将不同的数据显示在行方向上
df1 = pd.DataFrame({'a':[1,2],'b':[5,6]})
df2 = pd.DataFrame({'a':[0,2],'b':[5,7]})
df1.compare(df2,align_axis=0)
方法传入参数keep_equal=True,显示所有数据
df1 = pd.DataFrame({'a':[1,2],'b':[5,6]})
df2 = pd.DataFrame({'a':[0,2],'b':[5,7]})
df1.compare(df2,keep_equal=True)
方法传入keep_shape=True,可以保持原来的形状,便于查找不同数据的位置
df1 = pd.DataFrame({'a':[1,2],'b':[5,6]})
df2 = pd.DataFrame({'a':[1,2],'b':[5,7]})
df1.compare(df2,keep_shape=True)