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。