Pandas concat axis 详解
在数据分析和数据处理中,经常需要将多个数据集合并为一个大的数据集。Pandas 是 Python 中一个强大的数据处理库,它提供了多种方式来合并数据,其中 concat
函数是一个非常重要且常用的功能。本文将详细介绍 pandas.concat
函数的 axis
参数的使用方法,并通过多个示例展示如何在实际中应用这一功能。
1. pandas.concat 简介
pandas.concat
是 pandas 库中用于合并两个或多个 pandas 对象的函数。它主要用于合并 Series
和 DataFrame
对象。合并的方式可以是沿着某个轴,即横向或纵向。
函数的基本语法如下:
pandas.concat(objs, axis=0, join='outer', ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, sort=False, copy=True)
其中,axis
参数是本文的重点,它决定了合并的方向。axis=0
表示纵向合并(增加行),而 axis=1
表示横向合并(增加列)。
2. axis 参数详解
2.1 axis=0 的使用
当 axis=0
时,concat
函数将沿着索引轴(行)合并数据。这是默认设置,通常用于在数据集的末尾添加更多的行。
示例代码 1:纵向合并两个 DataFrame
import pandas as pd
df1 = pd.DataFrame({
"A": ["A0", "A1", "A2", "A3"],
"B": ["B0", "B1", "B2", "B3"],
"C": ["C0", "C1", "C2", "C3"],
"D": ["D0", "D1", "D2", "D3"]
}, index=[0, 1, 2, 3])
df2 = pd.DataFrame({
"A": ["A4", "A5", "A6", "A7"],
"B": ["B4", "B5", "B6", "B7"],
"C": ["C4", "C5", "C6", "C7"],
"D": ["D4", "D5", "D6", "D7"]
}, index=[4, 5, 6, 7])
result = pd.concat([df1, df2], axis=0)
print(result)
Output:
2.2 axis=1 的使用
设置 axis=1
时,concat
函数将沿着列轴合并数据,这通常用于添加新的列。
示例代码 2:横向合并两个 DataFrame
import pandas as pd
df1 = pd.DataFrame({
"A": ["A0", "A1", "A2", "A3"],
"B": ["B0", "B1", "B2", "B3"]
})
df2 = pd.DataFrame({
"C": ["C0", "C1", "C2", "C3"],
"D": ["D0", "D1", "D2", "D3"]
})
result = pd.concat([df1, df2], axis=1)
print(result)
Output:
3. 使用 concat 合并具有不同列的 DataFrame
当合并的 DataFrame 拥有不同的列时,concat
函数提供了多种处理方式,如使用 join
参数来指定如何处理不匹配的列。
示例代码 3:合并具有不同列的 DataFrame,使用外连接
import pandas as pd
df1 = pd.DataFrame({
"A": ["A0", "A1", "A2", "A3"],
"B": ["B0", "B1", "B2", "B3"]
})
df2 = pd.DataFrame({
"B": ["B4", "B5", "B6", "B7"],
"C": ["C4", "C5", "C6", "C7"]
})
result = pd.concat([df1, df2], axis=0, join='outer')
print(result)
Output:
示例代码 4:合并具有不同列的 DataFrame,使用内连接
import pandas as pd
df1 = pd.DataFrame({
"A": ["A0", "A1", "A2", "A3"],
"B": ["B0", "B1", "B2", "B3"]
})
df2 = pd.DataFrame({
"B": ["B4", "B5", "B6", "B7"],
"C": ["C4", "C5", "C6", "C7"]
})
result = pd.concat([df1, df2], axis=0, join='inner')
print(result)
Output:
4. 使用 keys 参数创建多级索引
在合并多个 DataFrame 时,可以使用 keys
参数为结果 DataFrame 创建多级索引,这有助于保持数据来源的清晰。
示例代码 5:使用 keys 创建多级索索
import pandas as pd
df1 = pd.DataFrame({
"A": ["A0", "A1", "A2", "A3"],
"B": ["B0", "B1", "B2", "B3"]
})
df2 = pd.DataFrame({
"A": ["A4", "A5", "A6", "A7"],
"B": ["B4", "B5", "B6", "B7"]
})
result = pd.concat([df1, df2], axis=0, keys=['df1', 'df2'])
print(result)
Output:
5. 忽略原有索引
在某些情况下,原有的索引可能不再有意义,此时可以使用 ignore_index=True
参数来生成新的整数索引。
示例代码 6:忽略原有索引
import pandas as pd
df1 = pd.DataFrame({
"A": ["A0", "A1", "A2", "A3"],
"B": ["B0", "B1", "B2", "B3"]
})
df2 = pd.DataFrame({
"A": ["A4", "A5", "A6", "A7"],
"B": ["B4", "B5", "B6", "B7"]
})
result = pd.concat([df1, df2], axis=0, ignore_index=True)
print(result)
Output:
6. 验证数据完整性
使用 verify_integrity=True
参数可以检查合并后的 DataFrame 是否包含重复的索引,这有助于避免数据错误。
示例代码 7:验证数据完整性
import pandas as pd
df1 = pd.DataFrame({
"A": ["A0", "A1", "A2", "A3"],
"B": ["B0", "B1", "B2", "B3"]
})
df2 = pd.DataFrame({
"A": ["A4", "A5", "A6", "A7"],
"B": ["B4", "B5", "B6", "B7"]
})
try:
result = pd.concat([df1, df2], axis=0, verify_integrity=True)
print(result)
except ValueError as e:
print("ValueError:", e)
Output:
7. 排序列
在合并时,如果设置 sort=True
,Pandas 将对非连接轴的列进行排序。这在某些情况下有助于快速查找数据,但可能会增加额外的计算成本。
示例代码 8:在合并时排序列
import pandas as pd
df1 = pd.DataFrame({
"A": ["A0", "A1", "A2", "A3"],
"C": ["C0", "C1", "C2", "C3"]
})
df2 = pd.DataFrame({
"B": ["B4", "B5", "B6", "B7"],
"D": ["D4", "D5", "D6", "D7"]
})
result = pd.concat([df1, df2], axis=1, sort=True)
print(result)
Output:
8. 复制数据
默认情况下,concat
函数的 copy
参数为 True
,这意味着在合并时会创建数据的副本,从而不影响原始数据。如果确定不需要保留原数据,可以设置 copy=False
来提高效率。
示例代码 9:不复制数据
import pandas as pd
df1 = pd.DataFrame({
"A": ["A0", "A1", "A2", "A3"],
"B": ["B0", "B1", "B2", "B3"]
})
df2 = pd.DataFrame({
"C": ["C4", "C5", "C6", "C7"],
"D": ["D4", "D5", "D6", "D7"]
})
result = pd.concat([df1, df2], axis=1, copy=False)
print(result)
Output:
9. 处理多个 DataFrame
在实际应用中,我们可能需要同时合并多个 DataFrame。concat
函数可以接受一个 DataFrame 列表,从而一次性完成多个 DataFrame 的合并。
示例代码 10:合并多个 DataFrame
import pandas as pd
df1 = pd.DataFrame({
"A": ["A0", "A1", "A2", "A3"],
"B": ["B0", "B1", "B2", "B3"]
})
df2 = pd.DataFrame({
"C": ["C4", "C5", "C6", "C7"],
"D": ["D4", "D5", "D6", "D7"]
})
df3 = pd.DataFrame({
"E": ["E8", "E9", "E10", "E11"],
"F": ["F8", "F9", "F10", "F11"]
})
result = pd.concat([df1, df2, df3], axis=1)
print(result)
Output:
10. 使用场景和实际应用
pandas.concat
是一个非常灵活的工具,可以应用于多种数据合并场景。以下是一些常见的使用场景:
- 时间序列数据合并:当你有按日期/时间分开存储的数据时,可以使用
concat
来合并这些数据。 - 特征工程:在机器学习的数据准备过程中,经常需要将多个特征集合并到一个大的 DataFrame 中。
- 数据清洗:在数据清洗过程中,可能需要从多个来源合并数据,然后统一进行清洗和处理。
示例代码 11:时间序列数据合并
import pandas as pd
# 假设这些 DataFrame 分别代表不同月份的数据
df_jan = pd.DataFrame({
"date": pd.date_range(start="2023-01-01", periods=31),
"value": range(31)
})
df_feb = pd.DataFrame({
"date": pd.date_range(start="2023-02-01", periods=28),
"value": range(28)
})
result = pd.concat([df_jan, df_feb], axis=0)
print(result)
Output:
通过这些示例,我们可以看到 pandas.concat
在数据处理中的强大功能和灵活性。无论是在数据科学、金融分析还是日常的数据处理任务中,掌握这一工具都将大大提高你的工作效率。