如何在 pandas df 列的条件子集中使用 endswith() 中的正则表达式?

How to use regexp in endswith() in conditional subsetting of pandas df column?

我想在数据框中 Sender name 列的条件子集中使用 .endswith() 或正则表达式。

Dataframe df 有两列 Sender emailSender name 我将使用它们来定义子集规则,select 来自特定商店和特定的所有邮件本店邮箱:

df = df[(df["Sender name"]=="Shop_name"]) & (df["Sender email"]=="reply@shop.com")]

Series.str.endswith or Series.str.contains 与正则表达式一起使用 - $ 用于字符串结尾,并通过 \ 转义 . ,因为 . 是特殊的正则表达式值 - 任何字符:

df1 = df[(df["Sender name"]=="Shop_name"]) & (df["Sender email"].str.endswith("@shop.com"))]

或者:

df1 = df[(df["Sender name"]=="Shop_name"]) & (df["Sender email"].str.contains("@shop\.com$"))]

使用.query

因为 pandas >= 0.25.0 我们可以使用 .query 和 pandas 方法 (.eq & str.endswith) 并使用反引号 (`) 查询列名带空格:

df.query('`Sender name`.eq("Shop_name") & `Sender email`.str.endswith("@shop.com")')

输出

       Sender email Sender name
2    reply@shop.com   Shop_name
3      buy@shop.com   Shop_name
4  noreply@shop.com   Shop_name

使用的示例数据框:

# Example dataframe
df = pd.DataFrame({'Sender email':['ex@example.com', 'ex2@example.com', "reply@shop.com", "buy@shop.com", "noreply@shop.com"],
                   'Sender name': ['example', 'example', 'Shop_name', 'Shop_name', 'Shop_name']})

       Sender email Sender name
0    ex@example.com     example
1   ex2@example.com     example
2    reply@shop.com   Shop_name
3      buy@shop.com   Shop_name
4  noreply@shop.com   Shop_name