← 返回首页

项目10: 多数据集合并

横向拼接与纵向堆叠,主键关联,处理重复与缺失

📊 数据集预览

使用多个数据集进行合并练习:retail_orders, user_logs

retail_orders.csv(前3行)

user_logs.csv(前3行)

🎯 学习目标

  • 使用 concat 纵向堆叠数据
  • 使用 concat 横向拼接数据
  • 使用 merge 按主键关联
  • 处理不同类型的连接(inner, left, right, outer)
  • 处理合并后的重复与缺失

💻 实战练习 1:加载数据

首先读取需要合并的数据集。

📖 内容讲解

在使用数据之前,需要先使用 pd.read_csv() 读取数据文件。这是数据分析的第一步。

import pandas as pd

orders = pd.read_csv('retail_orders.csv')
users = pd.read_csv('user_logs.csv')
print("订单数据:")
print(orders.head(2))
print("\n用户数据:")
print(users.head(2))
💡 小贴士:使用 head(n) 可以查看数据集的前n行,快速了解数据结构。

💻 实战练习 2:纵向堆叠

使用 concat 堆叠相似结构的数据。

📖 内容讲解

pd.concat() 用于沿着轴向合并数据。当 axis=0 时,表示纵向堆叠(增加行数)。

ignore_index=True 参数会使合并后的索引重新从0开始编号,而不是保留原来的索引。

df1 = orders.head(3).copy()
df2 = orders.tail(3).copy()
combined = pd.concat([df1, df2], axis=0, ignore_index=True)
print(f"合并后数据行数: {len(combined)}")
print(combined)
⚠️ 注意事项:纵向堆叠要求两个DataFrame具有相同的列名,否则会产生缺失值。

💻 实战练习 3:横向拼接

使用 concat 按列拼接数据。

📖 内容讲解

axis=1 时,concat 会横向拼接(增加列数)。左边的DataFrame选取部分列,右边的DataFrame选取另一部分列,然后按列拼接在一起。

df_left = orders[['order_id', 'product', 'quantity']].head(5)
df_right = orders[['price', 'region']].head(5)
combined = pd.concat([df_left, df_right], axis=1)
print(combined)
💡 小贴士:横向拼接时,各部分DataFrame的行数最好相同,否则会用缺失值补齐。

💻 实战练习 4:主键关联 - merge

按 common key 合并两个数据表。

📖 内容讲解

pd.merge() 是数据库风格的合并方法,按指定的主键(on参数)将两个表关联起来。

how 参数指定连接类型:inner 表示内连接(只保留两边都有的),left 表示左连接,right 表示右连接,outer 表示外连接(保留所有)。

orders['user_id'] = ['C101', 'C102', 'C103', 'C104', 'C105', 'C106', 'C107', 'C108', 'C109', 'C110']
users.rename(columns={'user_id': 'user_id'}, inplace=True)
merged = pd.merge(orders, users, on='user_id', how='inner')
print(merged[['user_id', 'product', 'total_spent']].head())
⚠️ 注意事项:关联的列名必须一致,否则需要使用 left_onright_on 参数分别指定。

💻 实战练习 5:不同连接类型

inner, left, right, outer 的区别。

📖 内容讲解

Inner Join(内连接):只保留两个表中都存在的键对应的行。

Left Join(左连接):以左表为基准,保留左表所有行,右表没有匹配的行用NaN填充。

Right Join(右连接):以右表为基准,保留右表所有行。

Outer Join(外连接):保留两个表的所有行,没有匹配的位置用NaN填充。

df_a = pd.DataFrame({'id': [1,2,3], 'value_a': ['A','B','C']})
df_b = pd.DataFrame({'id': [2,3,4], 'value_b': ['X','Y','Z']})
inner_join = pd.merge(df_a, df_b, on='id', how='inner')
left_join = pd.merge(df_a, df_b, on='id', how='left')
print("Inner Join:")
print(inner_join)
print("\nLeft Join:")
print(left_join)
💡 小贴士:选择哪种连接类型取决于业务需求。如果需要完整保留所有数据,用 outer;如果只需要两边都有的记录,用 inner。

📋 总代码运行框

整合本项目的所有代码,可以一次性运行查看完整结果。

综合代码编辑器
点击"运行代码"查看输出...

参考答案

import pandas as pd

orders = pd.read_csv('retail_orders.csv')
users = pd.read_csv('user_logs.csv')

df1 = orders.head(3).copy()
df2 = orders.tail(3).copy()
combined = pd.concat([df1, df2], axis=0, ignore_index=True)

df_left = orders[['order_id', 'product', 'quantity']].head(5)
df_right = orders[['price', 'region']].head(5)
combined_h = pd.concat([df_left, df_right], axis=1)

df_a = pd.DataFrame({'id': [1,2,3], 'value_a': ['A','B','C']})
df_b = pd.DataFrame({'id': [2,3,4], 'value_b': ['X','Y','Z']})
inner_join = pd.merge(df_a, df_b, on='id', how='inner')
left_join = pd.merge(df_a, df_b, on='id', how='left')