Pandas concat vs append
在数据分析和数据处理中,经常需要将多个数据集合并为一个大的数据集。Pandas库提供了多种方式来合并数据,其中最常用的是concat()
和append()
函数。这两个函数虽然都可以用来合并数据,但它们在使用方法和性能上有所不同。本文将详终介绍concat()
和append()
的用法,并通过示例代码展示它们的具体应用。
1. pandas concat()
函数
concat()
函数是pandas中用于合并两个或多个pandas对象的主要函数。它不仅可以合并行,也可以合并列,提供了极高的灵活性。
1.1 基本用法
concat()
函数的基本语法如下:
pandas.concat(objs, axis=0, join='outer', ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, sort=False, copy=True)
其中,objs
是要合并的pandas对象的列表或字典。下面是一个简单的示例:
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合并DataFrame
result = pd.concat([df1, df2])
print(result)
Output:
1.2 沿不同轴合并
concat()
可以通过axis
参数来控制合并的轴向。默认为0,表示纵向合并(增加行)。如果设置为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])
result = pd.concat([df1, df2], axis=1)
print(result)
Output:
1.3 使用keys创建多层索引
通过keys
参数,concat()
可以在合并时创建多层索引,这对于识别原始数据来源非常有用。下面是一个使用keys
的示例:
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])
result = pd.concat([df1, df2], keys=['x', 'y'])
print(result)
Output:
1.4 处理索引重复
concat()
在合并时默认保留原始对象的索引,即使这会导致索引重复。可以通过设置ignore_index=True
来生成新的整数索引。下面是一个处理索引重复的示例:
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])
result = pd.concat([df1, df2], ignore_index=True)
print(result)
Output:
2. pandas append()
函数
append()
函数是一个便捷的方法,用于将一行或多行追加到DataFrame上。它是concat()
的特例,主要用于纵向合并。
2.1 基本用法
append()
函数的基本语法如下:
df._append(other, ignore_index=False, verify_integrity=False, sort=False)
其中,other
可以是另一个DataFrame或者是一个能够转换为DataFrame的字典或列表。下面是一个简单的示例:
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])
# 创建一个新的DataFrame
df3 = pd.DataFrame({
'A': ['A8', 'A9', 'A10', 'A11'],
'B': ['B8', 'B9', 'B10', 'B11'],
'C': ['C8', 'C9', 'C10', 'C11'],
'D': ['D8', 'D9', 'D10', 'D11']
}, index=[8, 9, 10, 11])
# 使用append追加DataFrame
result = df1._append(df3)
print(result)
Output:
2.2 忽略原始索引
与concat()
类似,append()
也可以通过设置ignore_index=True
来忽略原始的索引值,生成新的整数索引。下面是一个忽略原始索引的示例:
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])
# 创建一个新的DataFrame
df3 = pd.DataFrame({
'A': ['A8', 'A9', 'A10', 'A11'],
'B': ['B8', 'B9', 'B10', 'B11'],
'C': ['C8', 'C9', 'C10', 'C11'],
'D': ['D8', 'D9', 'D10', 'D11']
}, index=[8, 9, 10, 11])
result = df1._append(df3, ignore_index=True)
print(result)
Output:
3. 性能比较
在处理大量数据时,concat()
通常比append()
性能更好。这是因为append()
每次调用都会创建一个新的DataFrame,如果在一个循环中多次使用append()
,这将导致大量的内存分配和复制。相反,concat()
可以一次性处理所有的数据合并操作,从而提高效率。
4. 总结
虽然concat()
和append()
都可以用于合并数据,但它们各有优势和适用场景。concat()
提供了更高的灵活性和更好的性能,适用于复杂的数据合并任务。而append()
则更适用于快速简单的纵向数据追加。在实际应用中,应根据具体需求选择合适的方法。