Pandas(第十三集:DataFrame数据合并)


1. pd.concat()【数据合并】

1.1 源数据

def make_df(indexs, columns):
    data = [[str(j) + str(i) for j in columns] for i in indexs]
    df = pd.DataFrame(data=data, index=indexs, columns=columns)
    return df


df1 = make_df([1, 2], list('AB'))
df2 = make_df([3, 4], list('AB'))
df3 = make_df([1, 2, 3, 4], list('ABCD'))
df4 = make_df([2, 3, 4, 5], list('BCDE'))

在这里插入图片描述
在这里插入图片描述

1.2 上下合并

pd.concat([df1, df2], axis=0)

在这里插入图片描述

1.3 左右合并

pd.concat([df1, df2], axis=1)

在这里插入图片描述

1.4 outer外连接 并集 补NaN

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

在这里插入图片描述

1.5 inner内连接 交集 取公共部分

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

在这里插入图片描述

2.pd.merge()【数据合并】

2.1 源数据

# 类似于MySQL中表和表直接的合并
# merge与concat的区别在于,merge需要依据某一共同的行或列来进行合并
# 使用pd.merge()合并时,会自动根据两者相同columns名称的那一列,作为key来进行合并
# 每一列元素的顺序不要求一致
df1 = pd.DataFrame(
    {
        'name': ['张三', '李四', '王五'],
        'age': [22, 33, 44],
        'id': [1, 2, 3]
    }
)
df2 = pd.DataFrame(
    {
        'id': [2, 3, 4],
        'sex': ['男', '女', '男'],
        'job': ['Saler', 'CEO', 'Programer']
    }
)
df3 = pd.DataFrame(
    {
        'name': ['张三', '李四', '王五'],
        'age': [22, 33, 44],
        'id': [1, 2, 2]
    }
)
df4 = pd.DataFrame(
    {
        'id': [2, 3, 4],
        'sex': ['男', '女', '男'],
        'job': ['Saler', 'CEO', 'Programer']
    }
)
df5 = pd.DataFrame(
    {
        'name': ['张三', '李四', '王五'],
        'age': [22, 33, 44],
        'id': [1, 2, 2]
    }
)
df6 = pd.DataFrame(
    {
        'id': [2, 2, 4],
        'sex': ['男', '女', '男'],
        'job': ['Saler', 'CEO', 'Programer']
    }
)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.2 合并,只取交集【一对一】

pd.merge(df1, df2)

在这里插入图片描述

2.3 合并,只取交集【一对多】

pd.merge(df3, df4)

在这里插入图片描述

2.4 合并,只取交集【多对多】

pd.merge(df3, df4)

在这里插入图片描述

3.key()的规范化

# 当两个及以上的DataFrame合并时,有多列相同时使用
# on():当两边的列名一致时使用
# left_on()、right_one():当两边的列名不一致时使用

3.1 源数据

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

在这里插入图片描述

3.2 合并时多列名称相同,需要指定一列作为连接的字段

pd.merge(df1, df2, on='id')
pd.merge(df1, df2, on='name')

在这里插入图片描述

3.3 如果没有相同的列名,则需要使用left_on、right_on来分别指出2个表中的不同列作为连接的字段

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

在这里插入图片描述

pd.merge(df1, df2, left_on='id', right_on='id2')

在这里插入图片描述

3.4 当左边的列和右边的index相同的时候,使用right_index=True作为连接字段

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

在这里插入图片描述

pd.merge(df1, df2, left_index=True, right_index=True)

在这里插入图片描述

3.5 左边的索引与右边的id2列进行连接,取交集

pd.merge(df1, df2, left_index=True, right_on='id2')

在这里插入图片描述

4. 合并方式

4.1 源数据

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

在这里插入图片描述

4.2 默认是内连接 inner join,how='inner’默认

pd.merge(df1, df2, how='inner')

在这里插入图片描述

4.3 外合并:how=‘outer’:补NaN

pd.merge(df1, df2, how='outer')

在这里插入图片描述

4.4 左合并、右合并:how=‘left’,how=‘right’

pd.merge(df1, df2, how='left')
pd.merge(df1, df2, how='right')

在这里插入图片描述

5. 列冲突的解决

# 当列冲突时,即有多个列名称相同时,需要使用on=来指定哪一个列作为key,配合suffixes指定冲突列名
# 可以使用suffixes=自己指定后缀
# 相当于自定义名称冲突的列,在冲突的列后面增加一个后缀

5.1 源数据

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

5.2 列冲突的解决

pd.merge(df1, df2, on='id', suffixes=['_df1', '_df2'])

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Monly21

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

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

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

打赏作者

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

抵扣说明:

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

余额充值