本文目录导读:

我来详细介绍Pandas中常用的数据合并函数,包含实际案例:
pd.concat() - 纵向或横向拼接
import pandas as pd
# 创建示例数据
df1 = pd.DataFrame({
'A': ['A0', 'A1', 'A2'],
'B': ['B0', 'B1', 'B2'],
'C': ['C0', 'C1', 'C2']
})
df2 = pd.DataFrame({
'A': ['A3', 'A4', 'A5'],
'B': ['B3', 'B4', 'B5'],
'C': ['C3', 'C4', 'C5']
})
# 纵向拼接(增加行)
result_vertical = pd.concat([df1, df2], axis=0)
print("纵向拼接结果:")
print(result_vertical)
# 横向拼接(增加列)
result_horizontal = pd.concat([df1, df2], axis=1)
print("\n横向拼接结果:")
print(result_horizontal)
# 使用ignore_index重置索引
result_reset = pd.concat([df1, df2], ignore_index=True)
print("\n重置索引的结果:")
print(result_reset)
输出示例:
纵向拼接结果:
A B C
0 A0 B0 C0
1 A1 B1 C1
2 A2 B2 C2
0 A3 B3 C3
1 A4 B4 C4
2 A5 B5 C5
pd.merge() - 类似SQL的JOIN操作
# 创建示例数据
left = pd.DataFrame({
'key': ['K0', 'K1', 'K2', 'K3'],
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']
})
right = pd.DataFrame({
'key': ['K0', 'K1', 'K2', 'K4'],
'C': ['C0', 'C1', 'C2', 'C4'],
'D': ['D0', 'D1', 'D2', 'D4']
})
# 内连接 (inner join) - 只保留匹配的行
inner_join = pd.merge(left, right, on='key', how='inner')
print("内连接结果:")
print(inner_join)
# 左连接 (left join) - 保留左表所有行
left_join = pd.merge(left, right, on='key', how='left')
print("\n左连接结果:")
print(left_join)
# 右连接 (right join) - 保留右表所有行
right_join = pd.merge(left, right, on='key', how='right')
print("\n右连接结果:")
print(right_join)
# 外连接 (outer join) - 保留所有行
outer_join = pd.merge(left, right, on='key', how='outer')
print("\n外连接结果:")
print(outer_join)
输出示例:
外连接结果:
key A B C D
0 K0 A0 B0 C0 D0
1 K1 A1 B1 C1 D1
2 K2 A2 B2 C2 D2
3 K3 A3 B3 NaN NaN
4 K4 NaN NaN C4 D4
多键合并和指定合并键
# 多键合并
left_multi = pd.DataFrame({
'key1': ['K0', 'K0', 'K1', 'K2'],
'key2': ['K0', 'K1', 'K0', 'K1'],
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']
})
right_multi = pd.DataFrame({
'key1': ['K0', 'K1', 'K1', 'K2'],
'key2': ['K0', 'K0', 'K0', 'K0'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']
})
# 使用多个键合并
multi_key_merge = pd.merge(left_multi, right_multi, on=['key1', 'key2'], how='inner')
print("多键合并结果:")
print(multi_key_merge)
# 指定左右不同的键名
left_diff = pd.DataFrame({
'id': ['K0', 'K1', 'K2'],
'value': ['V0', 'V1', 'V2']
})
right_diff = pd.DataFrame({
'key': ['K0', 'K1', 'K3'],
'info': ['I0', 'I1', 'I3']
})
# 指定不同的键名
diff_key_merge = pd.merge(left_diff, right_diff, left_on='id', right_on='key', how='left')
print("\n不同键名合并结果:")
print(diff_key_merge)
df.join() - 基于索引的合并
# 创建示例数据
df_left = pd.DataFrame({
'A': ['A0', 'A1', 'A2'],
'B': ['B0', 'B1', 'B2']
}, index=['I0', 'I1', 'I2'])
df_right = pd.DataFrame({
'C': ['C0', 'C1', 'C2'],
'D': ['D0', 'D1', 'D2']
}, index=['I0', 'I1', 'I3'])
# 基于索引合并
join_result = df_left.join(df_right, how='left')
print("基于索引的join结果:")
print(join_result)
# 使用后缀处理列名重复
df_left_suffix = pd.DataFrame({
'key': ['K0', 'K1', 'K2'],
'data': ['D0', 'D1', 'D2']
})
df_right_suffix = pd.DataFrame({
'key': ['K0', 'K1', 'K2'],
'data': ['E0', 'E1', 'E2']
})
suffix_join = df_left_suffix.join(df_right_suffix.set_index('key'),
on='key',
lsuffix='_left',
rsuffix='_right')
print("\n带后缀的join结果:")
print(suffix_join)
实际应用案例
# 案例:合并销售数据
# 创建订单表
orders = pd.DataFrame({
'order_id': [1, 2, 3, 4, 5],
'customer_id': [101, 102, 103, 101, 104],
'product': ['电脑', '手机', '平板', '耳机', '键盘'],
'amount': [5000, 3000, 2000, 500, 800],
'order_date': ['2023-01-01', '2023-01-02', '2023-01-03', '2023-01-04', '2023-01-05']
})
# 创建客户表
customers = pd.DataFrame({
'customer_id': [101, 102, 103, 104],
'name': ['张三', '李四', '王五', '赵六'],
'city': ['北京', '上海', '广州', '深圳'],
'level': ['VIP', '普通', 'VIP', '普通']
})
# 创建产品分类表
product_categories = pd.DataFrame({
'product': ['电脑', '手机', '平板', '耳机', '键盘'],
'category': ['电子产品', '电子产品', '电子产品', '配件', '配件']
})
# 1. 合并订单和客户信息
order_customer = pd.merge(orders, customers, on='customer_id', how='left')
print("订单-客户合并结果:")
print(order_customer)
# 2. 添加产品分类
full_data = pd.merge(order_customer, product_categories, on='product', how='left')
print("\n完整数据合并结果:")
print(full_data)
# 3. 多步合并并分析
# 计算每个城市的销售总额
city_sales = full_data.groupby('city')['amount'].sum().reset_index()
print("\n各城市销售总额:")
print(city_sales)
# 4. 合并多个DataFrame
# 创建月度销售目标
monthly_targets = pd.DataFrame({
'city': ['北京', '上海', '广州', '深圳'],
'target': [500000, 400000, 300000, 350000]
})
# 合并销售数据和目标
sales_analysis = pd.merge(city_sales, monthly_targets, on='city', how='left')
sales_analysis['完成率'] = sales_analysis['amount'] / sales_analysis['target'] * 100
print("\n销售分析结果:")
print(sales_analysis)
高级合并技巧
# 1. 处理重复列名
df1 = pd.DataFrame({'key': [1, 2, 3], 'value': ['a', 'b', 'c'], 'extra': [10, 20, 30]})
df2 = pd.DataFrame({'key': [1, 2, 3], 'value': ['x', 'y', 'z'], 'other': [100, 200, 300]})
# 使用suffixes参数处理重复列名
merged = pd.merge(df1, df2, on='key', suffixes=('_left', '_right'))
print("处理重复列名:")
print(merged)
# 2. 指示器(indicator)- 追踪每行来源
indicator_merge = pd.merge(
df1, df2,
on='key',
how='outer',
indicator=True
)
print("\n使用指示器追踪数据来源:")
print(indicator_merge)
# 3. 复杂的条件合并
# 使用函数创建条件
def conditional_merge(row, df_right):
if row['value_left'] == 'a':
return df_right[df_right['value'] == 'x']
else:
return df_right[df_right['value'] == 'y']
# 4. 合并后数据清洗
clean_merge = pd.merge(
df1, df2,
on='key',
how='outer',
indicator=True
).fillna({
'value_left': '缺失',
'value_right': '缺失',
'extra': 0,
'other': 0
})
print("\n合并后清洗数据:")
print(clean_merge)
# 常见合并模式
tips = """
1. 纵向合并:pd.concat([df1, df2], axis=0)
2. 横向合并:pd.concat([df1, df2], axis=1)
3. SQL JOIN:pd.merge(df1, df2, on='key', how='inner'/'left'/'right'/'outer')
4. 索引合并:df1.join(df2, how='left')
5. 多键合并:pd.merge(df1, df2, on=['key1', 'key2'])
6. 不同键名:pd.merge(df1, df2, left_on='key1', right_on='key2')
7. 处理重复:pd.merge(df1, df2, suffixes=('_x', '_y'))
8. 追踪来源:pd.merge(df1, df2, indicator=True)
"""
print(tips)
这些案例覆盖了Pandas中主要的数据合并操作,从基本的concat到复杂的merge操作,以及实际应用场景,记住选择哪种方法取决于你的具体需求:
concat: 单纯的数据拼接merge: 类似SQL的关联操作join: 基于索引的关联