我正在尝试使用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