首页 > 解决方案 > 如果 X 列包含字符串,则在 Y 列中查找子字符串的位置 - PYTHON

问题描述

如果列 ['Existe'] 包含“F”或“D”,我正在尝试在列 ['url'] 中包含的 URL 中查找字符串的起始位置。我是 Python 新手,我正在尝试在 Python 中从 Excel 复制工作流,经过一个小时尝试使用 lambda、numpy.where 或 numpy.select 的方法并在网上搜索后,我不得不寻求帮助。

我尝试应用以下代码,但这仅返回值存在,但实际上并没有给我在字符串中的位置。我目前拥有的是:

df['Start']= ["/t/" in x[0] and "F" in x[1] for x in zip(df['url'],df['Existe'])]

基本上,它给我的结果如下:

       order     id       date      time  URL                    typedCount transition  Existe  Start
0          0  14438   1/3/2021  14:49:37  messenger.com/t/xxxxx          0       link       F   True
1          1  14437   1/3/2021  14:49:18  messenger.com/t/xxxxx          0       link       F   True

我要做的是在 df['url'] 中找到“/t/”的起始位置,如果“F”存在于 df['Existe'] 中,并将结果放在一个新列中,df['开始']。我必须使用这个条件,因为 df['Existe'] 包含“F”和“D”,如果它是“F”,它必须寻找“/t/”,如果它是“/@me/” D”。

我正在寻找的结果是:

       order     id       date      time  URL                    typedCount transition  Existe  Start
0          0  14438   1/3/2021  14:49:37  messenger.com/t/xxxxx          0       link       F   14
1          1  14437   1/3/2021  14:49:18  messenger.com/t/xxxxx          0       link       F   14

有谁知道这样做的方法?

谢谢

标签: pythonpandas

解决方案


避免循环遍历行

使用 pandas 操作数据时,通常最好避免遍历 rows。使用仅对某些行进行操作的逻辑,最好从显式标识这些行开始。Existecolumn 的值等于的行的子集"F"是:

has_f = df["Existe"] == "F"

现在您可以使用has_f仅选择您关心的行df

在 pandas 中工作时,尽量使用内置的 pandas(或 numpy)函数。虽然在使用小型 DataFrame 时您可能不会注意到差异,但与df.apply()pandas 和 numpy 包中包含的优化代码相比,您编写和应用的任何原始 Python 代码的性能都会很差。幸运的是,pandas 有向量化的字符串函数,可以在这里为您提供帮助。要在一列字符串的每一行中查找子字符串的位置,请尝试以下操作:

t_locations = df["URL"].str.find("/t/")

这会产生列Series中子字符串第一次出现的整数位置。您可以对."/t/"URL"/@me/"

结合 pandas 的这两个特性需要使用df.loc索引器来选择您关心的行和列,并且只将str.find()函数应用于这些值:

df["Start"] = -1  # some default value
has_f = df["Existe"] == "F"

df.loc[has_f, "Start"] = df.loc[has_f, "URL"].str.find("/t/")
# The "~" here returns the inverse of the Boolean Series
df.loc[~has_f, "Start"] = df.loc[~has_f, "URL"].str.find("/@me/")

推荐阅读