前面合并两个DataFrame可以用concat函数,但concat本质上是在所有index上同时进行对齐合并。所以如果只要按index对齐,请使用concat方法。
如果想在任意列上对齐合并,则需要merge函数,这在sql应用很多。
pd.merge(left, right, how=‘inner’, on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort = False)
参数说明:
- left,right: 两个要对齐合并的DataFrame;
- how: 先做笛卡尔积操作,然后按照要求,保留需要的,缺失的数据填充NaN;取值:left/right/inner(交,以左DataFrame顺序为准)/outer(并,以字典序重新排序)
- on:对应列名或者行索引的名字,如果要在DataFrame相同的列索引做对齐,用这个参数;
- left_on, right_on, left_index, right_index:on对应列名或者行索引的名字(所以行索引一般要跟列一样看待,有自己的名字),用这俩参数;index对应要使用的index,不建议使用,会搞晕。
- sort: True or False,是否按字典序重新排序。
单纯按照index对齐
区别就是,如果有重复的列名,merge会重命名,concat不会。
>>> df1 = pd.DataFrame([[1,2],[3,4]], index = ['a','b'],columns = ['A','B'])
>>> df2 = pd.DataFrame([[1,3],[4,8]], index = ['b','d'],columns = ['B','C'])
>>> df1
A B
a 1 2
b 3 4
>>> df2
B C
b 1 3
d 4 8
>>> pd.merge(left=df1, right=df2, how='inner', left_index=True, right_index=True)
A B_x B_y C
b 3 4 1 3
>>> pd.concat([df1,df2], join='inner', axis=1)
A B B C
b 3 4 1 3
on
# df1的B列b行,df2的B列d行,都是4,把这两行拉出来合并一下
>>> pd.merge(left=df1, right=df2, how='inner', on='B')
A B C
0 3 4 8
# df1的A列和df2的C列比较,把相同的行拉出来,如果遇到列名重复,则重命名
>>> pd.merge(left=df1, right=df2, how='inner', left_on=['A'], right_on=['C'])
A B_x B_y C
0 3 4 1 3
how
# 保持left的DataFrame不变,用右侧来对齐,对不上的就填NaN
>>> pd.merge(left = df1, right = df2, how = 'left', on = ['B'] )
A B C
0 1 2 NaN
1 3 4 8.0
# 保持right的DataFrame不变,用左侧来对齐,对不上的填NaN
>>> pd.merge(left = df1, right = df2, how = 'right', on = ['B'] )
A B C
0 3.0 4 8
1 NaN 1 3
如果对齐的列存在重复值,就让它重复好了。操作逻辑仍然是一样的。