Pandas concat 示例
Pandas 是一个强大的 Python 数据分析库,它提供了大量的功能来处理和分析数据。其中,concat
函数是一个非常有用的工具,它可以用来合并两个或多个 pandas 数据结构。本文将详细介绍如何使用 pandas 的 concat
函数,包括多种不同的使用场景和示例代码。
1. 基本使用
concat
函数的基本用法是将两个或多个 DataFrame 或 Series 沿着某个轴合并。这里我们首先看一个简单的例子,合并两个 DataFrame。
示例代码 1
import pandas as pd
# 创建两个 DataFrame
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])
# 使用 concat 合并
result = pd.concat([df1, df2])
print(result)
Output:
2. 设置轴
在默认情况下,concat
是沿着 axis=0 进行合并,即纵向合并。但是,我们也可以设置 axis=1
来进行横向合并。
示例代码 2
import pandas as pd
# 创建两个 DataFrame
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']
})
# 横向使用 concat 合并
result = pd.concat([df1, df2], axis=1)
print(result)
Output:
3. 索引重置
在合并时,如果不希望保留原来的索引,可以使用 ignore_index=True
参数来重置索引。
示例代码 3
import pandas as pd
# 创建两个 DataFrame
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']
})
# 使用 concat 合并并重置索引
result = pd.concat([df1, df2], ignore_index=True)
print(result)
Output:
4. 处理重复列
在合并多个 DataFrame 时,如果存在重复的列名,Pandas 会保留所有列。我们可以通过设置 join
参数来控制如何处理这些列。
示例代码 4
import pandas as pd
# 创建两个 DataFrame
df1 = pd.DataFrame({
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']
})
df2 = pd.DataFrame({
'B': ['B4', 'B5', 'B6', 'B7'],
'C': ['C0', 'C1', 'C2', 'C3']
})
# 使用 concat 合并,只保留共有的列
result = pd.concat([df1, df2], join='inner')
print(result)
Output:
5. 使用 keys 创建多级索引
当我们合并多个 DataFrame 时,可以通过 keys
参数为每个 DataFrame 设置一个标签,这样合并后的 DataFrame 将具有多级索引。
示例代码 5
import pandas as pd
# 创建两个 DataFrame
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']
})
# 使用 concat 合并,并设置多级索引
result = pd.concat([df1, df2], keys=['df1', 'df2'])
print(result)
Output:
6. 合并时使用不同的索引
在合并 DataFrame 时,如果各 DataFrame 的索引不同,我们可以通过设置 ignore_index=True
来统一重置索引,或者通过 keys
参数来保留原有的索引结构。
示例代码 6
import pandas as pd
# 创建两个 DataFrame,索引不同
df1 = pd.DataFrame({
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']
}, index=[0, 1, 2, 3])
df2 = pd.DataFrame({
'A': ['A4', 'A5', 'A6', 'A7'],
'B': ['B4', 'B5', 'B6', 'B7']
}, index=[4, 5, 6, 7])
# 使用 concat 合并,并重置索引
result = pd.concat([df1, df2], ignore_index=True)
print(result)
Output:
7. 合并具有不同列的 DataFrame
当合并的 DataFrame 拥有不同的列时,我们可以选择保留所有列或只保留共有的列。这可以通过 join
参数来控制。
示例代码 7
import pandas as pd
# 创建两个 DataFrame,列不同
df1 = pd.DataFrame({
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']
})
df2 = pd.DataFrame({
'B': ['B4', 'B5', 'B6', 'B7'],
'C': ['C0', 'C1', 'C2', 'C3']
})
# 使用 concat 合并,保留所有列
result = pd.concat([df1, df2], join='outer')
print(result)
Output:
8. 使用 append 进行快速合并
除了 concat
函数外,Pandas 还提供了 append
方法,它是 concat
的简化版,专门用于纵向合并。
示例代码 8
import pandas as pd
# 创建两个 DataFrame
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']
})
# 使用 append 方法合并
result = df1.append(df2, ignore_index=True)
print(result)
9. 处理具有相同列名但不同数据类型的 DataFrame
当合并的 DataFrame 具有相同的列名但列的数据类型不同时,Pandas 会尝试转换数据类型以匹配。如果转换失败,它会引发错误。我们可以通过确保数据类型一致或使用 dtype
参数来处理这种情况。
示例代码 9
import pandas as pd
# 创建两个 DataFrame,相同的列名但不同的数据类型
df1 = pd.DataFrame({
'A': [1, 2, 3, 4],
'B': [5.0, 6.0, 7.0, 8.0]
})
df2 = pd.DataFrame({
'A': ['one', 'two', 'three', 'four'],
'B': ['five', 'six', 'seven', 'eight']
})
# 使用 concat 合并,这里可能需要处理数据类型问题
result = pd.concat([df1, df2], ignore_index=True)
print(result)
Output:
10. 使用验证选项来检查合并的结果
Pandas 的 concat
函数提供了 verify_integrity
参数,当设置为 True 时,如果合并的结果中存在重复的索引,将会引发异常。这是一种检查数据完整性的好方法。
示例代码 10
import pandas as pd
# 创建两个 DataFrame,故意设置重复的索引
df1 = pd.DataFrame({
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']
}, index=[0, 1, 2, 3])
df2 = pd.DataFrame({
'A': ['A4', 'A5', 'A6', 'A7'],
'B': ['B4', 'B5', 'B6', 'B7']
}, index=[3, 4, 5, 6])
# 使用 concat 合并,并检查索引完整性
try:
result = pd.concat([df1, df2], verify_integrity=True)
print(result)
except ValueError as e:
print("ValueError:", e)
Output:
11. 使用 sort 参数控制列的排序
在合并多个 DataFrame 时,如果它们包含不同的列,合并后的 DataFrame 默认会按照列名的字典顺序排序。我们可以通过设置 sort
参数来控制这一行为。
示例代码 11
import pandas as pd
# 创建两个 DataFrame,列名不同
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']
})
# 使用 concat 合并,不排序列
result = pd.concat([df1, df2], sort=False)
print(result)
Output:
12. 处理缺失数据
在合并 DataFrame 时,如果某些列在某些 DataFrame 中不存在,则合并后的 DataFrame 中这些列的缺失部分将被填充为 NaN。我们可以通过填充策略来处理这些缺失数据。
示例代码 12
import pandas as pd
# 创建两个 DataFrame,列不完全相同
df1 = pd.DataFrame({
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']
})
df2 = pd.DataFrame({
'A': ['A4', 'A5', 'A6', 'A7'],
'C': ['C4', 'C5', 'C6', 'C7']
})
# 使用 concat 合并,并处理缺失数据
result = pd.concat([df1, df2], sort=False).fillna('Missing')
print(result)
Output:
以上是 pandas concat
函数的详细介绍和多个实用的示例代码。通过这些示例,您可以了解如何在不同情况下使用 concat
来合并数据,并处理可能出现的各种问题。