HOWTO · Pandas

如何在 Pandas 的 DataFrame 中合并两列文本

在 pandas 库中使用 '+' 运算符、apply()、map()、str.cat()、agg() 方法在 DataFrame 中合并列

本页内容

在 Pandas DataFrame 中合并两列文本很简单:将两个 Series 以空格隔开相加,然后将结果赋给一个新列。
这样可以让每一对名字与姓氏与其原始行保持对齐。

import pandas as pd

data = [["Ali", "Azmat", "30"], ["Sharukh", "Khan", "40"], ["Linus", "Torvalds", "70"]]
df = pd.DataFrame(data, columns=["First", "Last", "Age"])
df["Full Name"] = df["First"] + " " + df["Last"]
print(df)
     First      Last Age       Full Name
0      Ali     Azmat  30       Ali Azmat
1  Sharukh      Khan  40    Sharukh Khan
2    Linus  Torvalds  70  Linus Torvalds

此示例会生成下方所示的 Full Name 列。五种方法使用相同的输入并生成相同的值。直接拼接字符串时请选择 + 或 Series.str.cat();当某个行函数能让转换更容易表达时,请使用逐行方法。

+ 运算符方法

对于字符串列,+ 会逐行拼接值。分隔符是一个普通字符串,因此可将 " " 改为 ", " 或其他分隔符,以符合所需的格式。此运算符也支持数值加法,因此仅仅数据类型相符并不会使其成为文本拼接操作:在此处使用它,是因为 First 和 Last 包含字符串。

import pandas as pd

data = [["Ali", "Azmat", "30"], ["Sharukh", "Khan", "40"], ["Linus", "Torvalds", "70"]]
df = pd.DataFrame(data, columns=["First", "Last", "Age"])
df["Full Name"] = df["First"] + " " + df["Last"]
print(df)

结果的 DataFrame 如下:

     First      Last Age       Full Name
0      Ali     Azmat  30       Ali Azmat
1  Sharukh      Khan  40    Sharukh Khan
2    Linus  Torvalds  70  Linus Torvalds

Series.map() 方法

Series.map() 会对一个 Series 中的每个值应用映射。它不是 DataFrame.map() 调用,而且这些名称本身已是字符串,用 str 转换并无必要;本示例保留该转换,是为了展示映射后的 Series 如何与另一列结合。对于混合值,在转换之前,请明确决定缺失值和非字符串值应如何表示。

import pandas as pd

data = [["Ali", "Azmat", "30"], ["Sharukh", "Khan", "40"], ["Linus", "Torvalds", "70"]]
df = pd.DataFrame(data, columns=["First", "Last", "Age"])
df["Full Name"] = df["First"].map(str) + " " + df["Last"]
print(df)

结果的 DataFrame 如下:

     First      Last Age       Full Name
0      Ali     Azmat  30       Ali Azmat
1  Sharukh      Khan  40    Sharukh Khan
2    Linus  Torvalds  70  Linus Torvalds

df.apply() 方法

apply 在传入 axis=1 时,可以对每一行调用一次函数。仅选取 First 和 Last 可让 Age 不参与合并。字符串 join 操作预期每个选取的值都是字符串;在将其用于较不均匀的数据之前,请有意识地转换或处理缺失值和非字符串值。对于两列文本之间的简单分隔符,+ 或 Series.str.cat() 通常更直接。

import pandas as pd

data = [["Ali", "Azmat", "30"], ["Sharukh", "Khan", "40"], ["Linus", "Torvalds", "70"]]
df = pd.DataFrame(data, columns=["First", "Last", "Age"])
df["Full Name"] = df[["First", "Last"]].apply(" ".join, axis=1)
print(df)

结果的 DataFrame 如下:

     First      Last Age       Full Name
0      Ali     Azmat  30       Ali Azmat
1  Sharukh      Khan  40    Sharukh Khan
2    Linus  Torvalds  70  Linus Torvalds

Series.str.cat() 方法

Series.str.cat() 专为拼接字符串值而设计,并以 sep 明确指定分隔符。默认情况下,任一 Series 中的缺失值都会使该行的结果成为缺失。当您想要为缺失值指定替代值时,请设置 na_rep,并选择与您的数据意义相符的替代值。

import pandas as pd

data = [["Ali", "Azmat", "30"], ["Sharukh", "Khan", "40"], ["Linus", "Torvalds", "70"]]
df = pd.DataFrame(data, columns=["First", "Last", "Age"])
df["Full Name"] = df["First"].str.cat(df["Last"], sep=" ")
print(df)

结果的 DataFrame 如下:

     First      Last Age       Full Name
0      Ali     Azmat  30       Ali Azmat
1  Sharukh      Khan  40    Sharukh Khan
2    Linus  Torvalds  70  Linus Torvalds

df.agg() 方法

agg 在给定 axis=1 和如 " ".join 之类的函数时,也可以应用逐行合并。与 apply 示例一样,它作用于选取的两列,并预期它们的值为字符串。当聚合已经是您逐行处理的一部分时,请使用它;对于这个简单任务,+ 运算符或 Series.str.cat() 能更直接地传达意图。将代码套用到您自己的数据时,请检查结果的 Full Name 列和几行数据。

import pandas as pd

data = [["Ali", "Azmat", "30"], ["Sharukh", "Khan", "40"], ["Linus", "Torvalds", "70"]]
df = pd.DataFrame(data, columns=["First", "Last", "Age"])
df["Full Name"] = df[["First", "Last"]].agg(" ".join, axis=1)
print(df)

结果的 DataFrame 如下:

     First      Last Age       Full Name
0      Ali     Azmat  30       Ali Azmat
1  Sharukh      Khan  40    Sharukh Khan
2    Linus  Torvalds  70  Linus Torvalds