Pandas concat dataframes
在数据分析和数据处理中,经常需要将多个数据集合并为一个更大的数据集。Pandas 提供了多种方式来实现数据的合并和连接,其中 concat()
函数是一个非常强大的工具,用于在轴向上合并多个 Pandas 对象。本文将详细介绍 concat()
函数的使用方法,并通过多个示例展示如何在实际场景中应用这一函数。
1. concat()
函数简介
concat()
函数主要用于将多个 DataFrame
或 Series
对象沿着一个轴进行合并。它的基本语法如下:
pandas.concat(objs, axis=0, join='outer', ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, sort=False, copy=True)
objs
: 需要合并的DataFrame
或Series
对象的列表或字典。axis
: 合并的轴向,默认为0,表示纵向合并;设置为1表示横向合并。join
: 指定合并的方式,outer
表示外连接,inner
表示内连接。ignore_index
: 布尔值,是否忽略原有的索引。keys
: 用于形成层次化索引的值。levels
: 指定用作层次化索引各级别上的索引,仅当keys
不为 None 时有效。names
: 用于结果层次化索引的名称。verify_integrity
: 检查新合并的轴是否包含重复项。sort
: 在合并时是否对索引进行排序。copy
: 是否复制数据。
2. 纵向合并
纵向合并是将数据按行拼接,这是 concat()
函数的默认行为。
示例代码 1
import pandas as pd
df1 = pd.DataFrame({
"A": ["A0", "A1"],
"B": ["B0", "B1"]
}, index=[0, 1])
df2 = pd.DataFrame({
"A": ["A2", "A3"],
"B": ["B2", "B3"]
}, index=[2, 3])
result = pd.concat([df1, df2])
print(result)
Output:
示例代码 2
import pandas as pd
df1 = pd.DataFrame({
"A": ["A0", "A1"],
"B": ["B0", "B1"]
}, index=[0, 1])
df2 = pd.DataFrame({
"A": ["A2", "A3"],
"B": ["B2", "B3"]
}, index=[2, 3])
result = pd.concat([df1, df2], ignore_index=True)
print(result)
Output:
示例代码 3
import pandas as pd
df1 = pd.DataFrame({
"A": ["A0", "A1"],
"B": ["B0", "B1"]
}, index=[0, 1])
df2 = pd.DataFrame({
"A": ["A2", "A3"],
"B": ["B2", "B3"]
}, index=[2, 3])
result = pd.concat([df1, df2], keys=["group1", "group2"])
print(result)
Output:
3. 横向合并
横向合并是将数据按列拼接,需要设置 axis=1
。
示例代码 4
import pandas as pd
df1 = pd.DataFrame({
"A": ["A0", "A1"],
"B": ["B0", "B1"]
})
df2 = pd.DataFrame({
"C": ["C0", "C1"],
"D": ["D0", "D1"]
})
result = pd.concat([df1, df2], axis=1)
print(result)
Output:
示例代码 5
import pandas as pd
df1 = pd.DataFrame({
"A": ["A0", "A1"],
"B": ["B0", "B1"]
})
df2 = pd.DataFrame({
"C": ["C0", "C1"],
"D": ["D0", "D1"]
})
result = pd.concat([df1, df2], axis=1, ignore_index=True)
print(result)
Output:
示例代码 6
import pandas as pd
df1 = pd.DataFrame({
"A": ["A0", "A1"],
"B": ["B0", "B1"]
})
df2 = pd.DataFrame({
"C": ["C0", "C1"],
"D": ["D0", "D1"]
})
result = pd.concat([df1, df2], axis=1, keys=["group1", "group2"])
print(result)
Output:
4. 使用不同的合并方式
join
参数控制合并时索引的对齐方式,可以是 inner
(内连接)或 outer
(外连接,默认)。
示例代码 7
import pandas as pd
df1 = pd.DataFrame({
"A": ["A0", "A1"],
"B": ["B0", "B1"]
}, index=[0, 1])
df2 = pd.DataFrame({
"B": ["B2", "B3"],
"C": ["C0", "C1"]
}, index=[1, 2])
result = pd.concat([df1, df2], join="inner")
print(result)
Output:
示例代码 8
import pandas as pd
df1 = pd.DataFrame({
"A": ["A0", "A1"],
"B": ["B0", "B1"]
}, index=[0, 1])
df2 = pd.DataFrame({
"B": ["B2", "B3"],
"C": ["C0", "C1"]
}, index=[1, 2])
result = pd.concat([df1, df2], join="outer")
print(result)
Output:
5. 处理重复索引
当合并的对象具有重复索引时,可以使用 verify_integrity
参数来检查。
示例代码 9
import pandas as pd
df1 = pd.DataFrame({
"A": ["A0", "A1"],
"B": ["B0", "B1"]
}, index=[0, 1])
df2 = pd.DataFrame({
"A": ["A2", "A3"],
"B": ["B2", "B3"]
}, index=[1, 2])
result = pd.concat([df1, df2], verify_integrity=True)
print(result)
6. 排序索引
通过设置 sort
参数,可以在合并时对索引进行排序。
示例代码 10
import pandas as pd
df1 = pd.DataFrame({
"A": ["A0", "A1"],
"B": ["B0", "B1"]
}, index=[1, 0])
df2 = pd.DataFrame({
"A": ["A2", "A3"],
"B": ["B2", "B3"]
}, index=[3, 2])
result = pd.concat([df1, df2], sort=True)
print(result)
Output:
7. 复制数据
copy
参数控制是否复制数据,这可以影响合并操作的性能。
示例代码 11
import pandas as pd
df1 = pd.DataFrame({
"A": ["A0", "A1"],
"B": ["B0", "B1"]
}, index=[0, 1])
df2 = pd.DataFrame({
"A": ["A2", "A3"],
"B": ["B2", "B3"]
}, index=[2, 3])
result = pd.concat([df1, df2], copy=False)
print(result)
Output:
8. 使用层次化索引
通过设置 keys
参数,可以在合并时创建层次化索引,这有助于维护数据来源的信息。
示例代码 12
import pandas as pd
df1 = pd.DataFrame({
"A": ["A0", "A1"],
"B": ["B0", "B1"]
})
df2 = pd.DataFrame({
"A": ["A2", "A3"],
"B": ["B2", "B3"]
})
result = pd.concat([df1, df2], keys=["df1", "df2"])
print(result)
Output:
示例代码 13
import pandas as pd
df1 = pd.DataFrame({
"A": ["A0", "A1"],
"B": ["B0", "B1"]
})
df2 = pd.DataFrame({
"A": ["A2", "A3"],
"B": ["B2", "B3"]
})
result = pd.concat([df1, df2], keys=["first group", "second group"], names=["Source", "Row ID"])
print(result)
Output:
9. 合并时使用不同的列名
当合并的 DataFrame
使用不同的列名时,可以通过设置 join_axes
参数来指定使用哪些列进行合并。
示例代码 14
import pandas as pd
df1 = pd.DataFrame({
"A": ["A0", "A1"],
"B": ["B0", "B1"]
})
df2 = pd.DataFrame({
"C": ["C0", "C1"],
"D": ["D0", "D1"]
})
result = pd.concat([df1, df2], axis=1, join_axes=[df1.columns])
print(result)
示例代码 15
import pandas as pd
df1 = pd.DataFrame({
"A": ["A0", "A1"],
"B": ["B0", "B1"]
})
df2 = pd.DataFrame({
"C": ["C0", "C1"],
"D": ["D0", "D1"]
})
result = pd.concat([df1, df2], axis=1, join_axes=[df2.columns])
print(result)
10. 处理缺失数据
在合并过程中,如果某些列在某些 DataFrame
中不存在,Pandas 将自动填充这些列的缺失值。
示例代码 16
import pandas as pd
df1 = pd.DataFrame({
"A": ["A0", "A1"],
"B": ["B0", "B1"]
})
df2 = pd.DataFrame({
"B": ["B2", "B3"],
"C": ["C0", "C1"]
})
result = pd.concat([df1, df2], sort=False)
print(result)
Output:
示例代码 17
import pandas as pd
df1 = pd.DataFrame({
"A": ["A0", "A1"],
"B": ["B0", "B1"]
})
df2 = pd.DataFrame({
"C": ["C2", "C3"],
"D": ["D0", "D1"]
})
result = pd.concat([df1, df2], sort=False)
print(result)
Output:
11. 总结
通过本文的介绍和示例,我们可以看到 Pandas 的 concat()
函数是一个非常强大的工具,用于在不同的场景下合并数据。无论是纵向还是横向合并,使用内连接还是外连接,处理索引的复制或创建层次化索引,concat()
都能提供灵活的解决方案。