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)
# 创建两个 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)
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))
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))
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"))
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)
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["第二年"])
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)
# 模拟多个月份的销售数据
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 中拼接数据的标准方法,性能更好,功能更完整。
