如果字符串以某个字符开头,则替换它

Posted

技术标签:

【中文标题】如果字符串以某个字符开头,则替换它【英文标题】:Replace a string if it starts with a certain character 【发布时间】:2021-11-22 04:15:45 【问题描述】:

我正在尝试使用 Pandas map 为键分配值,如果 DataFrame 中的条目以某个字符开头,则键将是返回的字符串。

使用 Pandas 文档中的示例,使用以下 DataFrame 和我的代码:

import numpy as np
import pandas as pd

s = pd.Series(['cat', 'dog', np.nan, 'rabbit'])

s.map( lambda x: x if x.startswith('c') else None: 'kitten', 
        lambda x: x if x.startswith('d') else None: 'puppy',
        lambda x: x if x.startswith('r') else None: 'bunny',
    )

预期结果:

0    kitten
1     puppy
2       NaN
3     bunny
dtype: object

目前,我的代码返回 4 个NaN 值。我指定startswith 因为我并不总是能够知道我的DataFrame 中字符串的最后一个字符,但我知道第一个字符。任何帮助将不胜感激。

【问题讨论】:

@jezrael 抱歉,我刚决定接受神罗的回答。如果您愿意,我可以将您的答案标记为正确的。 @Suva23 你应该选择作为已接受的真正解决了你问题的答案。我个人认为他的回答显示了对熊猫的更好理解,这也是我会选择的。 【参考方案1】:

您可以将第一个字母 -> 值的映射存储在字典中,然后只使用一个 lambda 函数来查找对应的值:

import numpy as np
import pandas as pd

mapping = 'c': 'kitten', 'd': 'puppy', 'r': 'bunny'

s = pd.Series(['cat', 'dog', np.nan, 'rabbit'])

s.map(lambda x: mapping.get(x[0]) if x else None)

【讨论】:

【参考方案2】:

函数lambda 可以通过索引str[0] 创建字典和映射首字母:

print (s.str[0].map('c': 'kitten', 'd': 'puppy', 'r': 'bunny'))
0    kitten
1     puppy
2       NaN
3     bunny
dtype: object

如果测试子串的字符串长度不同,则长度不一定相同:

d = 'ca': 'kitten', 'd': 'puppy', 'rab': 'bunny'

for k, v in d.items():
    s.loc[s.str.startswith(k, na=False)] = v
print (s)
0    kitten
1     puppy
2       NaN
3     bunny
dtype: object

【讨论】:

【参考方案3】:

你可以使用方法replace和正则表达式:

dct = '^c.*': 'kitten', '^d.*': 'puppy', '^r.*': 'bunny'
s.replace(dct, regex=True)

输出:

0    kitten
1     puppy
2       NaN
3     bunny
dtype: object

【讨论】:

以上是关于如果字符串以某个字符开头,则替换它的主要内容,如果未能解决你的问题,请参考以下文章

如果字符仅出现在开头,则替换它

如果行以另一个字符串开头,则替换文件中的字符串

如果字符串以某个值熊猫数据框结尾,则替换值

删除名称以某个字符串开头的所有表

你好,js中 使用~~可以去掉字符串开头的0 但如果全是数字并很长的话,就会变成其他数字请问~~是做啥用的

如果不匹配则替换字符