现在位置: 首页 > Pandas 教程 > 正文

Pandas 数据拼接(concat / append)

数据拼接是将多个 DataFrame 或 Series 按行或按列拼接在一起。pd.concat 是主要的拼接函数,append 是简化版本(已废弃,更推荐使用 concat)。


concat 基本用法

pd.concat() 可以沿着轴方向拼接多个 DataFrame 或 Series。

行方向拼接(上下拼接)

实例

import pandas as pd

# 创建两个 DataFrame
df1 = pd.DataFrame({
    "姓名": ["张三", "李四"],
    "年龄": [25, 30]
})

df2 = pd.DataFrame({
    "姓名": ["王五", "赵六"],
    "年龄": [28, 35]
})

print("DataFrame 1:")
print(df1)
print()

print("DataFrame 2:")
print(df2)
print()

# 上下拼接
result = pd.concat([df1, df2], ignore_index=True)
print("拼接结果:")
print(result)

列方向拼接(左右拼接)

实例

import pandas as pd

df1 = pd.DataFrame({
    "姓名": ["张三", "李四", "王五"]
})

df2 = pd.DataFrame({
    "年龄": [25, 30, 28],
    "城市": ["北京", "上海", "广州"]
})

# 左右拼接
result = pd.concat([df1, df2], axis=1)
print("左右拼接:")
print(result)

axis=0 表示行方向拼接(增加行),axis=1 表示列方向拼接(增加列)。


处理重复索引

ignore_index

实例

import pandas as pd

df1 = pd.DataFrame({
    "姓名": ["张三", "李四"],
    "年龄": [25, 30]
}, index=[0, 1])

df2 = pd.DataFrame({
    "姓名": ["王五", "赵六"],
    "年龄": [28, 35]
}, index=[0, 1])

# 默认保留原始索引
print("保留原始索引:")
print(pd.concat([df1, df2]))
print()

# 忽略旧索引,重新生成
print("忽略原始索引:")
print(pd.concat([df1, df2], ignore_index=True))

验证重复键

实例

import pandas as pd

df1 = pd.DataFrame({
    "A": [1, 2]
})

df2 = pd.DataFrame({
    "A": [3, 4]
})

# 检查是否有重复键
print("验证对象:")
print(pd.concat([df1, df2], verify_integrity=True))

处理列不匹配

join 参数

实例

import pandas as pd

df1 = pd.DataFrame({
    "A": [1, 2, 3],
    "B": ["a", "b", "c"]
})

df2 = pd.DataFrame({
    "B": ["x", "y", "z"],
    "C": [10, 20, 30]
})

print("df1:")
print(df1)
print()

print("df2:")
print(df2)
print()

# outer join(默认):保留所有列
print("outer 拼接(保留所有列):")
print(pd.concat([df1, df2], join="outer"))
print()

# inner join:只保留共同的列
print("inner 拼接(保留共同列):")
print(pd.concat([df1, df2], join="inner"))

只添加新列

实例

import pandas as pd

df1 = pd.DataFrame({
    "姓名": ["张三", "李四"],
    "年龄": [25, 30]
})

df2 = pd.DataFrame({
    "城市": ["北京", "上海"]
})

# 将 df2 的列添加到 df1
result = pd.concat([df1, df2], axis=1)
print("只添加新列:")
print(result)

keys 参数创建层次索引

实例

import pandas as pd

df1 = pd.DataFrame({"A": [1, 2], "B": [3, 4]})
df2 = pd.DataFrame({"A": [5, 6], "B": [7, 8]})
df3 = pd.DataFrame({"A": [9, 10], "B": [11, 12]})

# 使用 keys 参数创建层次索引
result = pd.concat([df1, df2, df3], keys=["第一年", "第二年", "第三年"])
print("带层次索引的拼接:")
print(result)
print()

# 从层次索引获取数据
print("获取第二年数据:")
print(result.loc["第二年"])

实战:合并多个月份数据

实例

import pandas as pd

# 模拟多个月份的销售数据
jan_sales = pd.DataFrame({
    "月份": ["2024-01"] * 3,
    "产品": ["A", "B", "C"],
    "销量": [100, 150, 80]
})

feb_sales = pd.DataFrame({
    "月份": ["2024-02"] * 3,
    "产品": ["A", "B", "C"],
    "销量": [120, 140, 90]
})

mar_sales = pd.DataFrame({
    "月份": ["2024-03"] * 3,
    "产品": ["A", "B", "C"],
    "销量": [110, 160, 85]
})

# 合并第一季度数据
quarterly = pd.concat([jan_sales, feb_sales, mar_sales], ignore_index=True)
print("第一季度汇总:")
print(quarterly)
print()

# 按月统计
monthly_summary = quarterly.groupby("月份")["销量"].sum()
print("月度销量汇总:")
print(monthly_summary)

append 方法(已废弃)

DataFrame.append() 在 Pandas 2.0 中已废弃,不推荐使用。请使用 pd.concat() 代替。

# 不推荐(已废弃)
result = df1.append(df2)

# 推荐
result = pd.concat([df1, df2])

concat 是 Pandas 中拼接数据的标准方法,性能更好,功能更完整。