pandas合并用法(concat、append、join、merge)

本文详细介绍了Pandas库中用于数据合并的四个关键方法:concat、append、join和merge。通过实例解析,阐述了它们的使用场景和区别,帮助你更好地理解和应用这些功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

concat 用法

import pandas as pd
def df_maker1(cols, idxs):
    return pd.DataFrame({c:[c+str(i) for i in idxs] for c in cols}, index=idxs)
def df_maker2(cols, idxs):
    return pd.DataFrame({c:[c+ "_" +str(i) for i in idxs] for c in cols}, index=idxs)
df1 = df_maker1('abc',[1,2,3])

df2 = df_maker2('cde',[3,4,5])
df3 = df_maker1('cde',[3,4,5])
print(df1)
print(df2)
print(df3)
    a   b   c
1  a1  b1  c1
2  a2  b2  c2
3  a3  b3  c3
     c    d    e
3  c_3  d_3  e_3
4  c_4  d_4  e_4
5  c_5  d_5  e_5
    c   d   e
3  c3  d3  e3
4  c4  d4  e4
5  c5  d5  e5
print(pd.concat([df1, df2]))
print(pd.concat([df1, df3]))
     a    b    c    d    e
1   a1   b1   c1  NaN  NaN
2   a2   b2   c2  NaN  NaN
3   a3   b3   c3  NaN  NaN
3  NaN  NaN  c_3  d_3  e_3
4  NaN  NaN  c_4  d_4  e_4
5  NaN  NaN  c_5  d_5  e_5
     a    b   c    d    e
1   a1   b1  c1  NaN  NaN
2   a2   b2  c2  NaN  NaN
3   a3   b3  c3  NaN  NaN
3  NaN  NaN  c3   d3   e3
4  NaN  NaN  c4   d4   e4
5  NaN  NaN  c5   d5   e5
# 使用concat([df1,df2], ignore_index=True)时,index项名一致的,后面的df会将前面的df覆盖
print(pd.concat([df1,df2], ignore_index=True))
print(pd.concat([df1,df3], ignore_index=True))   
     a    b    c    d    e
0   a1   b1   c1  NaN  NaN
1   a2   b2   c2  NaN  NaN
2   a3   b3   c3  NaN  NaN
3  NaN  NaN  c_3  d_3  e_3
4  NaN  NaN  c_4  d_4  e_4
5  NaN  NaN  c_5  d_5  e_5
     a    b   c    d    e
0   a1   b1  c1  NaN  NaN
1   a2   b2  c2  NaN  NaN
2   a3   b3  c3  NaN  NaN
3  NaN  NaN  c3   d3   e3
4  NaN  NaN  c4   d4   e4
5  NaN  NaN  c5   d5   e5
# axis:拼接轴方向,默认为0,沿行拼接;若为1,沿列拼接
# axis=1 代表沿列合并,默认外联join='outer'
print(pd.concat([df1, df2], axis=1))
print(pd.concat([df1, df3], axis=1))
     a    b    c    c    d    e
1   a1   b1   c1  NaN  NaN  NaN
2   a2   b2   c2  NaN  NaN  NaN
3   a3   b3   c3  c_3  d_3  e_3
4  NaN  NaN  NaN  c_4  d_4  e_4
5  NaN  NaN  NaN  c_5  d_5  e_5
     a    b    c    c    d    e
1   a1   b1   c1  NaN  NaN  NaN
2   a2   b2   c2  NaN  NaN  NaN
3   a3   b3   c3   c3   d3   e3
4  NaN  NaN  NaN   c4   d4   e4
5  NaN  NaN  NaN   c5   d5   e5
# join:默认外联'outer',拼接另一轴所有的label,缺失值用NaN填充;内联'inner',只拼接另一轴相同的label;
print(pd.concat([df1, df2], axis=1, join='inner'))
print(pd.concat([df1, df3], axis=1, join='inner'))
    a   b   c    c    d    e
3  a3  b3  c3  c_3  d_3  e_3
    a   b   c   c   d   e
3  a3  b3  c3  c3  d3  e3
# join_axes: 指定需要拼接的轴的labels,可在join既不内联又不外联的时候使用
# 指定某一个index进行拼接
print(pd.concat([df1,df2], axis=1, join_axes=[df1.index]))

from pandas import Index
_myindex = Index([1, 3, 4])
print(pd.concat([df1,df2], axis=1, join_axes=[_myindex]))
    a   b   c    c    d    e
1  a1  b1  c1  NaN  NaN  NaN
2  a2  b2  c2  NaN  NaN  NaN
3  a3  b3  c3  c_3  d_3  e_3
     a    b    c    c    d    e
1   a1   b1   c1  NaN  NaN  NaN
3   a3   b3   c3  c_3  d_3  e_3
4  NaN  NaN  NaN  c_4  d_4  e_4
# keys:多重索引,使用这个参数时,不能与ignore_index=True参数一起使用
print(pd.concat([df1,df2], axis=0, keys=["index_1", "index_2"]))
print(pd.concat([df1,df2], axis=1, keys=["cloumn_1", "cloumn_2"]))
print(pd.concat([df1,df3], axis=0, keys=["index_1", "index_2"]))
print(pd.concat([df1,df3], axis=1, keys=["cloumn_1", "cloumn_2"]))
             a    b    c    d    e
index_1 1   a1   b1   c1  NaN  NaN
        2   a2   b2   c2  NaN  NaN
        3   a3   b3   c3  NaN  NaN
index_2 3  NaN  NaN  c_3  d_3  e_3
        4  NaN  NaN  c_4  d_4  e_4
        5  NaN  NaN  c_5  d_5  e_5
  cloumn_1           cloumn_2          
         a    b    c        c    d    e
1       a1   b1   c1      NaN  NaN  NaN
2       a2   b2   c2      NaN  NaN  NaN
3       a3   b3   c3      c_3  d_3  e_3
4      NaN  NaN  NaN      c_4  d_4  e_4
5      NaN  NaN  NaN      c_5  d_5  e_5
             a    b   c    d    e
index_1 1   a1   b1  c1  NaN  NaN
        2   a2   b2  c2  NaN  NaN
        3   a3   b3  c3  NaN  NaN
index_2 3  NaN  NaN  c3   d3   e3
        4  NaN  NaN  c4   d4   e4
        5  NaN  NaN  c5   d5   e5
  cloumn_1           cloumn_2          
         a    b    c        c    d    e
1       a1   b1   c1      NaN  NaN  NaN
2       a2   b2   c2      NaN  NaN  NaN
3       a3   b3   c3       c3   d3   e3
4      NaN  NaN  NaN       c4   d4   e4
5      NaN  NaN  NaN       c5   d5   e5

append用法

# 与concat([df1, df2])效果相同
print(df1.append(df2))
print(df1.append(df3))
     a    b    c    d    e
1   a1   b1   c1  NaN  NaN
2   a2   b2   c2  NaN  NaN
3   a3   b3   c3  NaN  NaN
3  NaN  NaN  c_3  d_3  e_3
4  NaN  NaN  c_4  d_4  e_4
5  NaN  NaN  c_5  d_5  e_5
     a    b   c    d    e
1   a1   b1  c1  NaN  NaN
2   a2   b2  c2  NaN  NaN
3   a3   b3  c3  NaN  NaN
3  NaN  NaN  c3   d3   e3
4  NaN  NaN  c4   d4   e4
5  NaN  NaN  c5   d5   e5
# 与pd.concat([df1,df2], ignore_index=True)效果相同,index不唯一时,第二个df的不唯一项覆盖第一个df的不唯一项
print(df1.append(df2, ignore_index=True))
     a    b    c    d    e
0   a1   b1   c1  NaN  NaN
1   a2   b2   c2  NaN  NaN
2   a3   b3   c3  NaN  NaN
3  NaN  NaN  c_3  d_3  e_3
4  NaN  NaN  c_4  d_4  e_4
5  NaN  NaN  c_5  d_5  e_5
# 对index的唯一性进行验证,若有重复,报错。若已经设置了ignore_index,则该参数无效
# df1.append(df2,verify_integrity=True)

join用法

import numpy as np
df3 = pd.DataFrame({'lkey':['foo','bar','baz','foo'], 'value':np.arange(1,5)})
df4 = pd.DataFrame({'2key':['foo','bar','qux','bar'], 'value':np.arange(3,7)})
print(df3)
print(df4)
  lkey  value
0  foo      1
1  bar      2
2  baz      3
3  foo      4
  2key  value
0  foo      3
1  bar      4
2  qux      5
3  bar      6
# df3.join(df4)  # 报错,因为有相同的value键值
df3.join(df4 , lsuffix='_df3', rsuffix='_df4')    # 通过添加后缀避免冲突, 并不会修改df3的值
print(df3)
  lkey  value
0  foo      1
1  bar      2
2  baz      3
3  foo      4
# 通过将两边的key进行set_index
df3.set_index('lkey').join(df4.set_index('2key'), how='outer',lsuffix='_df3',rsuffix='_df4')  # 并不改变df3的值
value_df3value_df4
bar2.04.0
bar2.06.0
baz3.0NaN
foo1.03.0
foo4.03.0
quxNaN5.0
df3
lkeyvalue
0foo1
1bar2
2baz3
3foo4
# 通过设置后边df中key,并通过on与指定的左边df中的列进行合并,返回的index不变
print(df3)
print(df4)
df3.join(df4.set_index('2key'), on='lkey',lsuffix='_df3',rsuffix='_df4')
  lkey  value
0  foo      1
1  bar      2
2  baz      3
3  foo      4
  2key  value
0  foo      3
1  bar      4
2  qux      5
3  bar      6
lkeyvalue_df3value_df4
0foo13.0
1bar24.0
1bar26.0
2baz3NaN
3foo43.0

merge用法

pd.merge(df3, df4)   # on为None,自动找寻相同的列名,即为'value',且默认为内联
lkeyvalue2key
0baz3foo
1foo4bar
pd.merge(df3,df4,how='outer')   # 外联模式下
lkeyvalue2key
0foo1.0NaN
1bar2.0NaN
2baz3.0foo
3foo4.0bar
4NaN5.0qux
5NaN6.0bar
pd.merge(df3, df4, left_on='lkey',right_on='2key')  # 默认内联,2个foo*2个bar
lkeyvalue_x2keyvalue_y
0foo1foo3
1foo4foo3
2bar2bar4
3bar2bar6
 pd.merge(df3, df4, left_on='lkey',right_on='2key', how='left')   # 以左边的df3为标准进行连接
lkeyvalue_x2keyvalue_y
0foo1foo3.0
1bar2bar4.0
2bar2bar6.0
3baz3NaNNaN
4foo4foo3.0
pd.merge(df3, df4, left_on='lkey',right_on='2key', how='right')    # 以右边的df4为标准进行连接
lkeyvalue_x2keyvalue_y
0foo1.0foo3
1foo4.0foo3
2bar2.0bar4
3bar2.0bar6
4NaNNaNqux5
pd.merge(df3, df4, left_on='lkey',right_on='2key', how='outer')    # 全连接
lkeyvalue_x2keyvalue_y
0foo1.0foo3.0
1foo4.0foo3.0
2bar2.0bar4.0
3bar2.0bar6.0
4baz3.0NaNNaN
5NaNNaNqux5.0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值