在DataFrame列中用子字符串替换字符串

2024-09-30 18:33:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试将数据帧中的列与子字符串列表中的一个匹配。你知道吗

例如,取具有以下值的列(strings):

text1C1
text2A
text2
text4
text4B
text4A3

并创建一个新列,该列已将它们与以下子字符串匹配:

vals = ['text1', 'text2', 'text3', 'text4', 'text4B']

我目前拥有的代码可以工作,但它似乎是解决问题的一种非常低效的方法。你知道吗

df = pd.DataFrame({'strings': ['text1C1', 'text2A', 'text2', 'text4', 'text4B', 'text4A3']})


for v in vals:
        df.loc[df[df['strings'].str.contains(v)].index, 'matched strings'] = v

这将返回以下数据帧,这正是我所需要的。你知道吗

   strings    matched strings
0  text1C1              text1
1   text2A              text2
2    text2              text2
3    text4              text4
4   text4B             text4B
5  text4A3              text4

有没有更有效的方法,特别是对于更大的数据帧(10k+行)?你知道吗

我想不出如何处理vals的其中一个项同时也是另一个的子串(text4text4B的子串)


Tags: 数据方法字符串dfstrings子串valstext1
1条回答
网友
1楼 · 发布于 2024-09-30 18:33:38

将生成器与next一起用作匹配第一个值:

s = vals[::-1]
df['matched strings1'] = df['strings'].apply(lambda x: next(y for y in s if y in x))
print (df)
   strings matched strings matched strings1
0  text1C1           text1            text1
1   text2A           text2            text2
2    text2           text2            text2
3    text4           text4            text4
4   text4B          text4B           text4B
5  text4A3           text4            text4

更一般的解决方案,如果可能的话,没有匹配的值与iter和默认参数next

f = lambda x: next(iter(y for y in s if y in x), 'no match')
df['matched strings1'] = df['strings'].apply(f)

应改进您的解决方案:

for v in vals:
    df.loc[df['strings'].str.contains(v, regex=False), 'matched strings'] = v

相关问题 更多 >