如果字符串以某个字符开头,请替换该字符串



我正在尝试使用Pandasmap为关键帧赋值,如果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中字符串的最后一个字符,但我知道第一个字符/s。如有任何帮助,我们将不胜感激。

相反,函数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

您可以在字典中存储第一个字母的映射->值,然后只使用一个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)

您可以使用方法replace和regex:

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

输出:

0    kitten
1     puppy
2       NaN
3     bunny
dtype: object

最新更新