python - 如果 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
有谁知道这样做的方法?
谢谢
解决方案
避免循环遍历行
使用 pandas 操作数据时,通常最好避免遍历 rows。使用仅对某些行进行操作的逻辑,最好从显式标识这些行开始。Existe
column 的值等于的行的子集"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/")
推荐阅读
- javascript - 如何从 NodeList 中获取单个值
- php - 我的网站在迪拜被封锁,是否可以重定向到另一个域?
- java - 如何向特定用户发送推送通知
- java - java - 当value1的java类依赖于value2时如何用jackson反序列化JSON
- matlab - 如何仅在 Matalb 中计算成对相关性
- sed - 使用 sed 进行多行搜索
- java - 如何使用 Spring RestTemplate 恢复下载?
- sql - grafana 将 ps_cputime 转换为百分比
- c++ - 是否有 C++ 设计模式实现了控制线程可以拥有锁定资源的时间量的机制或互斥锁?
- phonegap - 捏缩放不适用于Phonegap inappbrowser _blank