如何使用 Pandas 的concat函数来合并数据
在数据处理和分析中,经常需要将多个数据集合并为一个大的数据集。Pandas 是 Python 中一个强大的数据分析工具,它提供了多种方式来合并数据,其中 concat()
函数是一个非常常用的功能。本文将详细介绍如何使用 Pandas 的 concat()
函数来合并数据,并特别关注 ignore_index
参数的使用。
1. concat()
函数简介
Pandas 的 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)
其中,ignore_index
参数默认为 False,如果设置为 True,则不使用原来的索引值,而是创建一个新的索引。
2. 使用 ignore_index=True
当我们合并数据时,如果不希望保留原有的索引,可以设置 ignore_index=True
。这在很多情况下非常有用,特别是原始数据的索引没有实际意义时。
示例代码 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], ignore_index=True)
print(result)
Output:
示例代码 2
import pandas as pd
df1 = pd.DataFrame({
"C": ["C0", "C1", "C2", "C3"],
"D": ["D0", "D1", "D2", "D3"]
}, index=[0, 1, 2, 3])
df2 = pd.DataFrame({
"C": ["C4", "C5"],
"D": ["D4", "D5"]
}, index=[4, 5])
result = pd.concat([df1, df2], ignore_index=True)
print(result)
Output:
3. 结合 axis
参数使用
concat()
函数的 axis
参数用于指定合并的轴向,默认为 0,表示垂直合并(行合并)。当设置 axis=1
时,表示水平合并(列合并)。结合 ignore_index
使用可以在不同的轴向上重置索引。
示例代码 3
import pandas as pd
df1 = pd.DataFrame({
"E": ["E0", "E1", "E2"],
"F": ["F0", "F1", "F2"]
}, index=[0, 1, 2])
df2 = pd.DataFrame({
"G": ["G0", "G1", "G2"],
"H": ["H0", "H1", "H2"]
}, index=[0, 1, 2])
result = pd.concat([df1, df2], axis=1, ignore_index=True)
print(result)
Output:
示例代码 4
import pandas as pd
df1 = pd.DataFrame({
"I": ["I0", "I1"],
"J": ["J0", "J1"]
}, index=[0, 1])
df2 = pd.DataFrame({
"K": ["K0", "K1"],
"L": ["L0", "L1"]
}, index=[0, 1])
result = pd.concat([df1, df2], axis=1, ignore_index=True)
print(result)
Output:
4. 结合 keys
参数使用
当我们设置 ignore_index=False
时,可以使用 keys
参数来创建一个多级索引。这样即使保留了原始索引,也可以通过外层索引来区分不同的数据源。
示例代码 5
import pandas as pd
df1 = pd.DataFrame({
"M": ["M0", "M1"],
"N": ["N0", "N1"]
}, index=[0, 1])
df2 = pd.DataFrame({
"O": ["O0", "O1"],
"P": ["P0", "P1"]
}, index=[2, 3])
result = pd.concat([df1, df2], keys=['df1', 'df2'])
print(result)
Output:
示例代码 6
import pandas as pd
df1 = pd.DataFrame({
"Q": ["Q0", "Q1"],
"R": ["R0", "R1"]
}, index=[0, 1])
df2 = pd.DataFrame({
"S": ["S0", "S1"],
"T": ["T0", "T1"]
}, index=[2, 3])
result = pd.concat([df1, df2], keys=['first', 'second'])
print(result)
Output:
5. 使用 sort
参数
sort
参数用于控制合并后的 DataFrame 是否按照列名进行排序。默认为 False,如果设置为 True,则合并后的 DataFrame 将根据列名排序。
示例代码 7
import pandas as pd
df1 = pd.DataFrame({
"U": ["U0", "U1"],
"V": ["V0", "V1"]
}, index=[0, 1])
df2 = pd.DataFrame({
"W": ["W0", "W1"],
"X": ["X0", "X1"]
}, index=[2, 3])
result = pd.concat([df1, df2], sort=True)
print(result)
Output:
示例代码 8
import pandas as pd
df1 = pd.DataFrame({
"Y": ["Y0", "Y1"],
"Z": ["Z0", "Z1"]
}, index=[0, 1])
df2 = pd.DataFrame({
"AA": ["AA0", "AA1"],
"BB": ["BB0", "BB1"]
}, index=[2, 3])
result = pd.concat([df1, df2], sort=True)
print(result)
Output:
6. 处理重复列名
在使用 concat()
函数合并 DataFrame 时,如果存在重复的列名,Pandas 默认会保留所有列。我们可以通过设置 verify_integrity=True
来检查是否有重复的列名,如果有,则会抛出异常。
示例代码 9
import pandas as pd
df1 = pd.DataFrame({
"CC": ["CC0", "CC1"],
"DD": ["DD0", "DD1"]
}, index=[0, 1])
df2 = pd.DataFrame({
"CC": ["CC2", "CC3"],
"EE": ["EE0", "EE1"]
}, index=[2, 3])
try:
result = pd.concat([df1, df2], verify_integrity=True)
print(result)
except ValueError as e:
print("Error:", e)
Output:
示例代码 10
import pandas as pd
df1 = pd.DataFrame({
"FF": ["FF0", "FF1"],
"GG": ["GG0", "GG1"]
}, index=[0, 1])
df2 = pd.DataFrame({
"FF": ["FF2", "FF3"],
"HH": ["HH0", "HH1"]
}, index=[2, 3])
try:
result = pd.concat([df1, df2], verify_integrity=True)
print(result)
except ValueError as e:
print("Error:", e)
Output:
7. 使用 copy
参数
当设置 copy=False
时,concat()
函数尽可能不复制数据,直接使用原始对象的内存。这可以提高性能,尤其是在处理大型数据集时。但是,如果原始数据在后续操作中被修改,那么合并后的数据也会受到影响。
示例代码 11
import pandas as pd
df1 = pd.DataFrame({
"II": ["II0", "II1"],
"JJ": ["JJ0", "JJ1"]
}, index=[0, 1])
df2 = pd.DataFrame({
"KK": ["KK0", "KK1"],
"LL": ["LL0", "LL1"]
}, index=[2, 3])
result = pd.concat([df1, df2], copy=False)
print(result)
Output:
示例代码 12
import pandas as pd
df1 = pd.DataFrame({
"MM": ["MM0", "MM1"],
"NN": ["NN0", "NN1"]
}, index=[0, 1])
df2 = pd.DataFrame({
"OO": ["OO0", "OO1"],
"PP": ["PP0", "PP1"]
}, index=[2, 3])
result = pd.concat([df1, df2], copy=False)
print(result)
Output:
8. 处理不同的数据类型
当合并的 DataFrame 包含不同的数据类型时,Pandas 会尝试找到一个兼容所有数据的类型。如果无法找到,它会将数据类型提升到更通用的类型。
示例代码 13
import pandas as pd
df1 = pd.DataFrame({
"QQ": [1, 2],
"RR": [3.0, 4.0]
}, index=[0, 1])
df2 = pd.DataFrame({
"SS": ["five", "six"],
"TT": [7.0, 8.0]
}, index=[2, 3])
result = pd.concat([df1, df2])
print(result)
Output:
示例代码 14
import pandas as pd
df1 = pd.DataFrame({
"UU": [True, False],
"VV": [9.0, 10.0]
}, index=[0, 1])
df2 = pd.DataFrame({
"WW": ["eleven", "twelve"],
"XX": [13, 14]
}, index=[2, 3])
result = pd.concat([df1, df2])
print(result)
Output:
9. 结合使用 join
参数
join
参数控制如何处理不在所有 DataFrame 中出现的列。默认值为 ‘outer’,表示取并集,如果设置为 ‘inner’,则表示取交集。
示例代码 15
import pandas as pd
df1 = pd.DataFrame({
"YY": ["YY0", "YY1"],
"ZZ": ["ZZ0", "ZZ1"]
}, index=[0, 1])
df2 = pd.DataFrame({
"AA": ["AA0", "AA1"],
"BB": ["BB0", "BB1"]
}, index=[2, 3])
result = pd.concat([df1, df2], join='inner')
print(result)
Output:
示例代码 16
import pandas as pd
df1 = pd.DataFrame({
"CC": ["CC0", "CC1"],
"DD": ["DD0", "DD1"]
}, index=[0, 1])
df2 = pd.DataFrame({
"EE": ["EE0", "EE1"],
"FF": ["FF0", "FF1"]
}, index=[2, 3])
result = pd.concat([df1, df2], join='inner')
print(result)
Output:
10. 总结
在本文中,我们详细介绍了 Pandas 的 concat()
函数及其参数的使用,特别是 ignore_index
参数。通过多个示例代码,我们展示了如何在实际应用中使用这些功能来有效地合并数据。