pandas---数据合并(concat、append、merge)

1. concat函数

pd.concat([data1, data2], axis=1)

按照行或列进行合并,axis=0为列索引,axis=1为行索引。

df1 = make_df([1, 2], ['A', 'B'])
df2 = make_df([3, 4], ['A', 'B'])
display(df1, df2)
# 默认上下合并,垂直合并
pd.concat([df1, df2])  
# 左右合并,水平合并
pd.concat([df1, df2], axis=1)  

# 忽略行索引:重置索引
pd.concat([df1, df2], ignore_index=True)
# 使用多层索引 keys
pd.concat([df1, df2], keys=['x', 'y'])
pd.concat([df1, df2], keys=['x', 'y'], axis=1)

不匹配级联指的是级联的维度的索引不一致。例如纵向级联时列索引不一致,横向级联时行索引不

一致。对应索引没有值,会自动用NaN填充。

外连接:类似并集,显示所有数据,补NaN(默认模式)。

内连接: 类似交集, 只显示共同的部分,只连接匹配的项。

pd.concat([df3, df4])
pd.concat([df3, df4], join='outer')
pd.concat([df3, df4], join='inner')

 2. append函数

display(df3, df4)
df3.append(df4)

3. merge函数

类似MySQL中表和表直接的合并;

merge与concat的区别在于,merge需要依据某一共同的行或列来进行合并;

使用pd.merge()合并时,会自动根据两者相同column名称的那一列,作为key来进行合并;

每一列元素的顺序不要求一致。

# 一对一合并
df1 = pd.DataFrame({
    'name': ['张三', '李四', '王五'],
    'id': [1, 2, 3],
    'age': [22, 33, 44]
})
df2 = pd.DataFrame({
    'id': [2, 3, 4],
    'sex': ['男', '女', '男'],
    'job': ['Saler', 'CEO', 'Programer']
})
display(df1, df2)
# 合并: 
# pd.merge(df1, df2)
df1.merge(df2)

 

# 多对一合并
df3 = pd.DataFrame({
    'name': ['张三', '李四', '王五'],
    'id': [1, 2, 2],
    'age': [22, 33, 44]
})
df4 = pd.DataFrame({
    'id': [2, 3, 4],
    'sex': ['男', '女', '男'],
    'job': ['Saler', 'CEO', 'Programer']
})
display(df3, df4)
df3.merge(df4)

 

# 多对多合并
df5 = pd.DataFrame({
    'name': ['张三', '李四', '王五'],
    'id': [1, 2, 2],
    'age': [22, 33, 44]
})
df6 = pd.DataFrame({
    'id': [2, 2, 4],
    'sex': ['男', '女', '男'],
    'job': ['Saler', 'CEO', 'Programer']
})
display(df5, df6)
df5.merge(df6)

 

key的规范化:

使用on=显式指定哪一列为key,当2个DataFrame有多列相同时使用:

df1 = pd.DataFrame({
    'id': [1, 2, 3],
    'name': ['张三', '李四', '王五'],
    'age': [22, 33, 44]
})
df2 = pd.DataFrame({
    'id': [2, 3, 4],
    'name': ['王五', '女', '男'],
    'job': ['Saler', 'CEO', 'Programer']
})
display(df1, df2)
# 如果有多列名称相同,需要指定一列作为连接的字段
# df1.merge(df2, on='id')
df1.merge(df2, on='name')

 

使用left_on和right_on指定左右两边的列作为key,当左右两边的key都不相等时使用:

# 如果没有相同的列名,则需要使用left_on,right_on来分别指定2个表中的不同列作为连接的字段
df1.merge(df2, left_on='id', right_on='id2')

当左边的列和右边的index相同的时候,使用right_index=True:

# 可以使用行索引作为连接的字段
df1.merge(df2, left_index=True, right_index=True)
df1.merge(df2, left_index=True, right_on='id2')

内合并:只保留两者都有的key(默认模式);

外合并 how='outer':补NaN;

左合并、右合并:how='left',how='right'。

# 外连接 : 会显示2个表的所有数据
df1.merge(df2, how='outer')
# 左连接: 显示左边df1表的所有数据和右边表df2的公共数据
df1.merge(df2, how='left')
# 右连接: 显示右边df2表的所有数据和左边表df1的公共数据
df1.merge(df2, how='right')

列冲突的解决:

即有多个列名称相同时,需要使用on=来指定哪一个列作为key,配合suffixes指定冲突列名,

可以使用suffixes=自己指定后缀。

df1 = pd.DataFrame({
    'id': [1, 2, 3],
    'name': ['张三', '李四', '王五'],
    'age': [22, 33, 44]
})
df2 = pd.DataFrame({
    'id': [2, 3, 4],
    'name': ['男', '女', '男'],
    'job': ['Saler', 'CEO', 'Programer']
})
display(df1, df2)
df1.merge(df2, on='id', suffixes=['_df1', '_df2'])

 

总结:

合并有三种现象: 一对一、多对一、多对多;

合并默认会找相同的列名进行合并,如果有多个列名相同,用on来指定;

如果没有列名相同,但是数据又相同,可以通过left_on、right_on来分别指定要合并的列;

如果想和index合并,使用left_index, right_index来指定;

如果多个列相同,合并之后可以通过suffixes来区分;

还可以通过how来控制合并的结果,默认是内合并,还有外合并outer,左合并left,右合并right。

 

 

 

 

 

 

 

 

 

 

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三月七꧁ ꧂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值