下面的问题已得到简化。
该解决方案应适用于较大的数据集和较大的词典。
给定pandas.DataFrame
import pandas as pd
pd.DataFrame(data = {'foo': [1223, 2931, 3781],
'bar': ["34 fake st, footown", "88 real crs, barrington", "28 imaginary st, bazington"]})
| | foo | bar |
|---:|------:|:---------------------------|
| 0 | 1223 | 34 fake st, footown |
| 1 | 2931 | 88 real crs, barrington |
| 2 | 3781 | 28 imaginary st, bazington |
和一个字典对象:
my_dictionary = {'st':'street', 'crs':'crescent'}
用my_dictionary
替换pandas.DataFrame
的一列中包含的子字符串的最佳方法是什么?
我期望有一个结果如下的pandas.DataFrame:
| | foo | bar |
|---:|------:|:--------------------------------|
| 0 | 1223 | 34 fake street, footown |
| 1 | 2931 | 88 real crescent, barrington |
| 2 | 3781 | 28 imaginary street, bazington |
我尝试了以下方法:
for key, val in my_dictionary.items():
df.bar.loc[df.bar.str.contains(key)] = df.bar.loc[df.bar.str.contains(key)].apply(lambda x: x.replace(key,val))
df.bar
用给定的输出。
SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
self._setitem_with_indexer(indexer, value)
0 34 fake street, footown
1 88 real crescent, barrington
2 28 imaginary street, bazington
Name: bar, dtype: object
我如何在不收到上述警告消息的情况下执行重新分配;而不使用.copy()
吗?
问题来源:stackoverflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
您可以使用Series.replace
:
df["bar"] = df["bar"].replace(my_dictionary, regex=True)
print (df)
foo bar
0 1223 34 fake street, footown
1 2931 88 real crescent, barrington
2 3781 28 imaginary street, bazington
回答来源:stackoverflow