如果字符串以某个字符开头,则替换它
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
【讨论】:
以上是关于如果字符串以某个字符开头,则替换它的主要内容,如果未能解决你的问题,请参考以下文章