本文目录导读:

我来详细介绍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: 基于索引的关联
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播