[英]If column X contains String then find position of substring in column Y - PYTHON
如果列 ['Existe'] 包含“F”或“D”,我正在尝试在列 ['url'] 中包含的 URL 中找到字符串的起始 position。 I'm new to Python and I'm trying to replicate a workflow from Excel in Python and after an hour of trying methods with lambda, numpy.where or numpy.select, and searching the web, I had to ask for help.
我尝试应用以下代码,但这仅返回该值存在,但实际上并没有给我字符串中的 position。 我目前拥有的是:
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['Existe'] 中存在“F”,则在 df['url'] 中找到“/t/”的起始 position 并将结果放入新列 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 操作数据时,通常最好避免循环遍历行。 使用仅对某些行进行操作的逻辑,最好从显式标识这些行开始。 Existe
列的值等于"F"
的行的子集是:
has_f = df["Existe"] == "F"
现在您可以使用has_f
到 select 仅您关心的行df
。
在 pandas 工作时,尽量使用内置的 pandas(或 numpy)函数。 虽然在使用小型 DataFrame 时您可能不会注意到差异,但与 pandas 和 Z2EA9510C37F7F89E4942F 包中包含的优化代码相比,您使用df.apply()
编写和应用的任何原始 Python 代码的性能都会很差。 幸运的是,pandas 具有矢量化字符串函数,可以在这里为您提供帮助。 要在一列字符串的每一行中查找 substring 的位置,请尝试以下操作:
t_locations = df["URL"].str.find("/t/")
这会在 URL 列中产生 substring "/t/"
的第一次出现的Series
URL
位置。 你可以对"/@me/"
做同样的事情。
结合 pandas 的这两个功能需要使用df.loc
索引器到 select 您关心的行和列,并且仅将str.find()
ZC1C425268E68385D1AB5074C17A94F 应用于这些值:
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/")
您可以通过使用 DataFrame 的 apply() 例程来实现此目的:
def process_row(row):
if row['Existe']=='F':
row['Start']=row['URL'].find('/t/') + 1
elif row['Existe']=='D':
row['Start']=row['URL'].find('/@me/') + 1
return row
df.apply(process_row,axis=1)
我不确定你试图用'F'
和'D'
解释什么,所以我假设这个例子和 output 将 go
order id date time URL typedCount transition Existe
0 14438 1/3/2021 14:49:37 messenger.com/t/xxxxx 0 link F
1 14437 1/3/2021 14:49:18 messenger.com/t/xxxxx 0 link F
2 14437 1/3/2021 14:49:18 messenger.com/t/@me/xxxx 0 link D
3 14437 1/3/2021 14:49:18 messenger.com/t/@me/xxxx 0 link FD
4 14437 1/3/2021 14:49:18 messenger.com/nothing/xxxx 0 link FD
基本上你可以使用df.apply
在你的 dataframe 上执行 function:
import pandas as pd
def myfunc(row):
f_pos = -1
d_pos = -1
if 'F' in row['Existe']:
f_pos = row['URL'].find('/t')
if 'D' in row['Existe']:
d_pos = row['URL'].find('/@me/')
return f_pos, d_pos
df = pd.read_csv("yourfile", sep=",") # change the field separator
df['Start'] = df.apply(myfunc, axis=1)
output 是:
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 (13, -1)
1 1 14437 1/3/2021 14:49:18 messenger.com/t/xxxxx 0 link F (13, -1)
2 2 14437 1/3/2021 14:49:18 messenger.com/t/@me/xxxx 0 link D (-1, 15)
3 3 14437 1/3/2021 14:49:18 messenger.com/t/@me/xxxx 0 link FD (13, 15)
4 4 14437 1/3/2021 14:49:18 messenger.com/nothing/xxxx 0 link FD (-1, -1)
如您所见,您可以编辑myfunc
以更好地满足您的需求,因为我不确定同时拥有F
和D
是什么意思。
值得注意的是,如果找不到字符串, str.find()
方法将返回-1
。
如果没有找到F
或D
,我还将myfunc
设置为返回相同的-1
,但您可以设置其他任何内容。 例如,如果您将其设置为-2
或False
,您可以快速知道它是否没有找到任何东西,因为它不在 URL 中,或者因为在Existe
列中没有F
或D
编辑:在 python 中,索引从 0 开始,这意味着第 14 个字符位于索引 13
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.