pandas包的merge、join和concat方法来完成数据的合并和拼接,merge方法主要是基于两个dataframe的共同列进行合并,join方法主要是基于两个dataframe的索引进行合并,concat方法是对series或dataframe进行行拼接或列拼接,本文详细分析了上面三种方法的合并和拼接操作。
1. Merge方法
merge(right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=('_x', '_y'), copy=True, indicator=False, validate=None) -> 'DataFrame'
pandas的merge方法是基于共同列,将两个dataframe连接起来。下面分析merge方法的主要参数含义:
left/right:左/右位置的dataframe。
how:数据合并的方式。left:基于左dataframe列的数据合并;right:基于右dataframe列的数据合并;outer:基于列的数据外合并(取并集);inner:基于列的数据内合并(取交集);默认为'inner'。
on:用来合并的列名,这个参数需要保证两个dataframe有相同的列名。
left_on/right_on:左/右dataframe合并的列名,也可为索引,数组和列表。
left_index/right_index:是否以index作为数据合并的列名,True表示是。
sort:根据dataframe合并的keys排序,默认是。
suffixes:若有相同列且该列没有作为合并的列,可通过suffixes设置该列的后缀名,一般为元组和列表类型。
merges通过设置how参数选择两个dataframe的连接方式,有内连接,外连接,左连接,右连接,下面通过例子介绍连接的含义。
2. Join方法
3. concat方法
concat方法是拼接函数,有行拼接和列拼接,默认是行拼接,拼接方法默认是外拼接(并集),拼接的对象是pandas数据类型。
obj:要合并的series,dataframe或者是panel构成的序列,常将这些数据排成一个列表[data1,data2....]。
axis:按照哪个方向拼接,0是纵向拼接(默认),1是横向拼接。
join:设置合并取交集(inner)还是并集(outer)。纵向拼接时取column的交并集,横向拼接时取index的交并集。
join_axes:index的列表,仅在横向合并时使用,指明要将数据合并入哪个原表的index。
ignore_index:如果设置为true,则无视表的index,直接合并,合并后生成新的index。
keys:表标识的列表,用来区分合并的表来自哪里。
a=pd.Series([1,2,3],index=['x1','x2','x3'])
b=pd.Series([2,3,4],index=['x1','x2','x4'])
pd.concat([a,b])
x1 1
x2 2
x3 3
x1 2
x2 3
x4 4
dtype: int64
pd.concat([a,b],axis=1)
0 1
x1 1.0 2.0
x2 2.0 3.0
x3 3.0 NaN
x4 NaN 4.0
pd.concat([a,b],keys=['fea1','fea2'])
fea1 x1 1
x2 2
x3 3
fea2 x1 2
x2 3
x4 4
dtype: int64
加上join参数的属性,如果为’inner’得到的是两表的交集,如果是outer,得到的是两表的并集。
如果有join_axes的参数传入,可以指定根据那个轴来对齐数据
pd.concat([df1, df4], axis=1, join_axes=[df1.index])
append
append是series和dataframe的方法,使用它就是默认沿着列进行凭借(axis = 0,列对齐)
DataFrame.append(*other*, *ignore_index=False*, *verify_integrity=False*, *sort=None*)
- other: 是要添加的数据,可以是dataframe,dict,Seris,list等等。
- ignore_index: 参数为True时将在数据合并后,按照0,1,2,3....的顺序重新设置索引,忽略了旧索引。
- verify_integrity:参数为True时,如果合并的数据与原数据包含索引相同的行,将报错。
Groupby
import numpy as np
company=['A','B','C','D']
data=pd.DataFrame({
'company':[company[x] for x in np.random.randint(0,len(company),10)],
'salary':np.random.randint(5,50,10),
'age':np.random.randint(15,50,10)
})
data.groupby('company')
data.groupby('company').agg({'salary':'median','age':'mean'})
avg_salary=data.groupby('company')['salary'].mean().to_dict()
data['avg_salary']=data['company'].map(avg_salary)
data
data['avg_age']=data.groupby('company')['age'].transform('mean')
data