Pandas 中的拼接操作将一个 DataFrame 追加到另一个 DataFrame 的一个轴上。它的工作方式类似于 SQL UNION ALL 操作。
我们使用 concat()
方法在 Pandas 中拼接两个或多个 DataFrame。例如,
import pandas as pd
# create dataframes
df1 = pd.DataFrame({'A': ['A0', 'A1'],
'B': ['B0', 'B1']},
index=[0, 1])
df2 = pd.DataFrame({'A': ['A2', 'A3'],
'B': ['B2', 'B3']},
index=[2, 3])
# concatenate two dataframes
result = pd.concat([df1, df2])
print(result)
输出
A B 0 A0 B0 1 A1 B1 2 A2 B2 3 A3 B3
在此示例中,我们创建了两个 DataFrame (df1
和 df2
) 并将它们垂直堆叠 (沿轴 0)。
concat() 语法
Pandas 中 concat()
方法的语法是
pd.concat(objs, axis=0, join='outer', ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, sort=False, copy=True)
这里,
objs
: Series 或 DataFrame 对象的序列axis
(可选): 要拼接的轴join
(可选): 要执行的连接类型ignore_index
(可选): 如果为True
,它将不使用拼接轴上的索引值,并将生成默认的整数索引keys
(可选): 用于使用传递的键作为最外层来构建分层索引verify_integrity
(可选): 如果为True
,它会检查新拼接的轴是否包含重复项,如果发现重复项则引发ValueError
sort
(可选): 如果非拼接轴未对齐,则对其进行排序
示例:带参数的 concat()
让我们来看一个关于 ignore_index
和 sort
等参数的示例。
import pandas as pd
# create dataframes
df1 = pd.DataFrame({'Name': ['John', 'Alice', 'Bob'],
'Age': [25, 30, 35],
'City': ['New York', 'Paris', 'London']})
df2 = pd.DataFrame({'Name': ['Emily', 'Michael', 'Sophia', 'Rita'],
'Age': [28, 32, 27, 22],
'City': ['Berlin', 'Tokyo', 'Sydney', 'Delhi']})
# concatenate dataframes while ignoring index
result_ignore_index = pd.concat([df1, df2], ignore_index = True)
# concatenate dataframes and sort the result
result_sort = pd.concat([df1, df2], sort = True)
# display the concatenated results
print('ignore_index = True\n', result_ignore_index)
print('\nsort = True\n', result_sort)
输出
ignore_index = True Name Age City 0 John 25 New York 1 Alice 30 Paris 2 Bob 35 London 3 Emily 28 Berlin 4 Michael 32 Tokyo 5 Sophia 27 Sydney 6 Rita 22 Delhi sort = True Age City Name 0 25 New York John 1 30 Paris Alice 2 35 London Bob 0 28 Berlin Emily 1 32 Tokyo Michael 2 27 Sydney Sophia 3 22 Delhi Rita
在此示例中,我们在 concat()
方法中使用了 ignore_index
和 sort
参数。
当 ignore_index
设置为 True
时,将忽略各个 DataFrame 的索引值,并在生成的 DataFrame 中使用新的索引值。
当 sort
设置为 True
时,非拼接轴 (在此情况下为轴 0) 将按字母顺序排序。因此,在生成的 DataFrame 中,列会根据其名称按字母顺序排序。
沿轴 1 拼接
通过指定 axis=1
,我们可以沿列 (水平) 拼接。例如,
import pandas as pd
# create dataframes
df1 = pd.DataFrame({'Name': ['John', 'Alice', 'Bob'],
'Age': [25, 30, 35],
'City': ['New York', 'Paris', 'London']})
df2 = pd.DataFrame({'Name': ['Emily', 'Michael', 'Sophia', 'Rita'],
'Age': [28, 32, 27, 22],
'City': ['Berlin', 'Tokyo', 'Sydney', 'Delhi']})
# concatenate dataframes along axis 1
result = pd.concat([df1, df2], axis=1)
print(result)
输出
Name Age City Name Age City 0 John 25.0 New York Emily 28 Berlin 1 Alice 30.0 Paris Michael 32 Tokyo 2 Bob 35.0 London Sophia 27 Sydney 3 NaN NaN NaN Rita 22 Delhi
在这里,我们将两个 DataFrame df1 和 df2 沿水平轴进行了拼接。
默认情况下,在沿轴 1 拼接 DataFrame 时会执行外连接。这意味着它会返回一个包含来自两个原始 DataFrame 的所有行的 DFS。如果某行没有匹配项,则用 NaN
填充缺失值。
如果我们想返回一个仅包含两个原始 DataFrame 中具有匹配值的行的 DataFrame,则需要通过指定 join = 'inner'
来执行内连接。
示例:内连接与外连接
import pandas as pd
# create dataframes
df1 = pd.DataFrame({'Name': ['John', 'Alice', 'Bob'],
'Age': [25, 30, 35],
'City': ['New York', 'Paris', 'London']})
df2 = pd.DataFrame({'Name': ['Emily', 'Michael', 'Sophia', 'Rita'],
'Age': [28, 32, 27, 22],
'City': ['Berlin', 'Tokyo', 'Sydney', 'Delhi']})
# concatenate dataframes with outer join
result_outer = pd.concat([df1, df2], axis = 1)
# concatenate dataframes with inner join
result_inner = pd.concat([df1, df2], axis = 1, join = 'inner')
# display the concatenated results
print('Outer Join\n', result_outer)
print('\nInner Join\n', result_inner)
输出
Outer Join Name Age City Name Age City 0 John 25.0 New York Emily 28 Berlin 1 Alice 30.0 Paris Michael 32 Tokyo 2 Bob 35.0 London Sophia 27 Sydney 3 NaN NaN NaN Rita 22 Delhi Inner Join Name Age City Name Age City 0 John 25 New York Emily 28 Berlin 1 Alice 30 Paris Michael 32 Tokyo 2 Bob 35 London Sophia 27 Sydney
请注意,在外连接的情况下,会在空白处填充 NaN
值以包含 df2 的所有行。
而在内连接的情况下,没有匹配索引的行将被完全删除。
带键的拼接
当我们需要为生成的 DataFrame 添加一个额外的信息级别时,keys
参数特别有用。
当我们向 concat()
函数传递一个键列表时,Pandas 将创建一个新的分层索引级别。新的索引级别包含根据数据来源的信息。例如,
import pandas as pd
# create dataframes
df1 = pd.DataFrame({'Name': ['John', 'Alice', 'Bob'],
'Age': [25, 30, 35],
'City': ['New York', 'Paris', 'London']})
df2 = pd.DataFrame({'Name': ['Emily', 'Michael', 'Sophia', 'Rita'],
'Age': [28, 32, 27, 22],
'City': ['Berlin', 'Tokyo', 'Sydney', 'Delhi']})
# concatenate dataframes while ignoring index
result = pd.concat([df1, df2], keys = ['from_df1', 'from_df2'])
print(result)
输出
Name Age City from_df1 0 John 25 New York 1 Alice 30 Paris 2 Bob 35 London from_df2 0 Emily 28 Berlin 1 Michael 32 Tokyo 2 Sophia 27 Sydney 3 Rita 22 Delhi
在此示例中,我们传递了键列表 ['from_df1', 'from_df2']
。
这在生成的 DataFrame 中创建了一个双层索引。索引的第一层是我们指定的键 ('from_df1'
和 'from_df2'
),索引的第二层是 df1 和 df2 的原始索引。
此功能在数据的来源对于进一步的数据分析很重要时尤其有用。