我想基本上使用python查找和替换。
但是,我想说一个单元格是否包含某些内容,然后替换为我想要的内容。
我知道
str.replace('safsd','something else')
但是,我不知道如何指定如何摆脱该单元格中的所有内容。我使用*
吗?我对python中的不太熟悉,但我知道在bash shell中*
引用了所有内容......
我有
df['Description']
可以包含我只想用'optiplex 9010 for classes and research'
替换的'optiplex 9010'
。或'macbook air 11 with configurations...etc.'
,我只想'macbook air 11'
我的目标是......
if Df['Description'].str.contains('macbook air 11')
then Df['Description'].str.replace(' (not sure what I put in here) , 'mabook air 11')
任何帮助/想法?
谢谢!
**可能是helfpul的其他信息...
我正在处理数以千计的不同用户输入。因此,某人所购买的“描述”在背景,措辞,结构等方面根本不会相同。 我可以手动进入excel并按照包含'optiplex 9010'的内容进行过滤,然后用简单的描述替换所有内容,对macbook执行相同操作等。
我认为使用pandas / python .str.contains和.str.replace可能有一些更简单的方法。
希望额外的信息有用!让我知道
答案 0 :(得分:4)
str.replace采用正则表达式,例如'macbook air 11'
跟随零(或更多)(*
)任何字符(.
)(您也可以标记为大小写)不敏感的):
Df['Description'].str.replace('macbook air 11.*' , 'macbook air 11')
可以找到关于正则表达式的一点启蒙here。
但是,你可能会更好,特别是如果你已经有一个完整的主题列表,以规范化名称(例如在question / answer中使用fuzzywuzzy):
from fuzzywuzzy.fuzz import partial_ratio
Df['Description'].apply(lambda x: max(topics, key=lambda t: partial_ratio(x, t)))
答案 1 :(得分:0)
你可以在像这样的Pandas系列上使用正则表达式。
首先创建一个愚蠢的字符串系列:
>>> import re
>>> import pandas as pd
>>> s=pd.Series(['Value {} of 3'.format(e) for e in range(1,4)])
>>> s
0 Value 1 of 3
1 Value 2 of 3
2 Value 3 of 3
然后使用regex sub将所有数字的字符串值替换为5
,将小写字母替换为字符串:
>>> s.apply(lambda s: re.sub(r'\d+', '5', s).lower())
0 value 5 of 5
1 value 5 of 5
2 value 5 of 5
dtype: object
当然,如果您只想替换all,可以使用正则表达式或字符串替换:
>>> s.apply(lambda s: re.sub(r'^.*$', 'GONE!!!', s))
0 GONE!!!
1 GONE!!!
2 GONE!!!
dtype: object
>>> s.apply(lambda s: s.replace(s, 'GONE!!!'))
0 GONE!!!
1 GONE!!!
2 GONE!!!
dtype: object
答案 2 :(得分:0)
这是一个可以使用正则表达式解决的问题的完美示例。我也发现这样的情况是了解它们的一个很好的借口!这是一个关于如何使用正则表达式http://www.regular-expressions.info/tutorial.html
的非常详细的教程