繁体   English   中英

Pandas:在字符串中查找 substring 的开始和结束 position

[英]Pandas: find start and end position of substring in string

from numpy.core.defchararray import find
df = pd.DataFrame({
  "string": ["abc", "def", "ghi"],
  "substring": ["bc", "e", "ghi"]
})

我得到以下确定开始 position 但我不知道如何得到结束 position:

df.assign(start=find(df['string'].values.astype(str),df['substring'].values.astype(str)))

预期结果:

string substring start end
abc    bc        1     2
def    e         1     1
ghi    ghi       0     2

将列表推导与:=一起用于表达式中的变量赋值,用于元组中的end字符串值,最后赋值给新列:

df[['start','end']]=[(c:=a.find(b),c+len(b)-1) for a,b in zip(df['string'],df['substring'])]
print (df)
  string substring  start  end
0    abc        bc      1    2
1    def         e      1    1
2    ghi       ghi      0    2

您的解决方案应该使用相同的逻辑进行更改:

from numpy.core.defchararray import find

df=df.assign(start=find(df['string'].values.astype(str),df['substring'].values.astype(str)),
             end = lambda x: x['start'] + x['substring'].str.len() - 1)
print (df)
  string substring  start  end
0    abc        bc      1    2
1    def         e      1    1
2    ghi       ghi      0    2

如果没有匹配返回-1 ,那么可能的解决方案应该在下一步中设置NaN s:

df = pd.DataFrame({
  "string": ["ab7c", "def", "ghi"],
  "substring": ["bc", "e", "ghi"]
})
print (df)
  string substring
0   ab7c        bc
1    def         e
2    ghi       ghi

from numpy.core.defchararray import find

df=df.assign(start=find(df['string'].values.astype(str),df['substring'].values.astype(str)),
         end = lambda x: x['start'] + x['substring'].str.len() - 1)

df[['start','end']] = df[['start','end']].mask(df['start'].eq(-1))
print (df)
  string substring  start  end
0   ab7c        bc    NaN  NaN
1    def         e    1.0  1.0
2    ghi       ghi    0.0  2.0

另一种具有更好代码可读性的方法如下

## this will ensure if not found it will return None
def index_of_substring(main_string, substring):
    try:
        start_index = main_string.index(substring)
        end_index = start_index + len(substring) -1
        return(pd.Series([start_index,end_index]))
    except ValueError:
        return(pd.Series([None,None]))
## Then you call the function as follows
df = pd.DataFrame({
  "string": ["abc", "def", "ghi"],
  "substring": ["bc", "e", "ghi"]
})
df[["start","end"]] = df.apply(lambda row:index_of_substring(row['string'],row["substring"]),axis=1)
df.head()

string  substring   start   end
0   abc bc  1   2
1   def e   1   1
2   ghi ghi 0   2  

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM