横向拼接与纵向堆叠,主键关联,处理重复与缺失
使用多个数据集进行合并练习:retail_orders, user_logs。
首先读取需要合并的数据集。
在使用数据之前,需要先使用 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行,快速了解数据结构。
使用 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)
使用 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)
按 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_on 和 right_on 参数分别指定。
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)
整合本项目的所有代码,可以一次性运行查看完整结果。
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')