如何在 pandas df 列的条件子集中使用 endswith() 中的正则表达式?
How to use regexp in endswith() in conditional subsetting of pandas df column?
我想在数据框中 Sender name
列的条件子集中使用 .endswith()
或正则表达式。
Dataframe df
有两列 Sender email
,Sender name
我将使用它们来定义子集规则,select 来自特定商店和特定的所有邮件本店邮箱:
df = df[(df["Sender name"]=="Shop_name"]) & (df["Sender email"]=="reply@shop.com")]
但是后来我发现还有来自buy@shop.com
,noreply@shop.com
等的邮件。有什么办法可以把这些邮箱整齐地引入到类似*@shop.com
第二个条件?
我尝试使用 endswith()
,但无法弄清楚如何使其适用于 series
对象。我发现我可以先用列中的所有邮件形成一个列表,然后用 pd.Series.isin
检查发送邮件服务器是否在其中。但也许那里有更优雅的东西?
将 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
我想在数据框中 Sender name
列的条件子集中使用 .endswith()
或正则表达式。
Dataframe df
有两列 Sender email
,Sender name
我将使用它们来定义子集规则,select 来自特定商店和特定的所有邮件本店邮箱:
df = df[(df["Sender name"]=="Shop_name"]) & (df["Sender email"]=="reply@shop.com")]
但是后来我发现还有来自
buy@shop.com
,noreply@shop.com
等的邮件。有什么办法可以把这些邮箱整齐地引入到类似*@shop.com
第二个条件?我尝试使用
endswith()
,但无法弄清楚如何使其适用于series
对象。我发现我可以先用列中的所有邮件形成一个列表,然后用pd.Series.isin
检查发送邮件服务器是否在其中。但也许那里有更优雅的东西?
将 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