Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Pandas、Python中,如何用几个指定的单词替换系列中的所有单词?_Python_String_Replace_Pandas - Fatal编程技术网

在Pandas、Python中,如何用几个指定的单词替换系列中的所有单词?

在Pandas、Python中,如何用几个指定的单词替换系列中的所有单词?,python,string,replace,pandas,Python,String,Replace,Pandas,我想基本上使用python查找和替换 但是,我想说,如果一个单元格包含某些内容,那么用我想要的内容替换它 我知道 str.replace('safsd','something else') 但是,我不知道如何指定如何清除该单元格中的所有内容。我是否使用*?我对python中的这一点不太熟悉,但我知道在bash shell中,*引用了所有内容 我有 df['Description'] 可以包含'optiplex 9010 for class and research',我只想用'optipl

我想基本上使用python查找和替换

但是,我想说,如果一个单元格包含某些内容,那么用我想要的内容替换它

我知道

str.replace('safsd','something else')
但是,我不知道如何指定如何清除该单元格中的所有内容。我是否使用
*
?我对python中的这一点不太熟悉,但我知道在bash shell中,
*
引用了所有内容

我有

df['Description'] 
可以包含
'optiplex 9010 for class and research'
,我只想用
'optiplex 9010'
替换它。或者
'macbookair11的配置…等等。
我只想
'macbookair11'

我的目标是

if  Df['Description'].str.contains('macbook air 11')
  then Df['Description'].str.replace(' (not sure what I put in here) , 'mabook air 11')
有什么帮助/想法吗

谢谢

**其他可能有用的信息

我正在处理数千种不同的用户输入。因此,对某人所购买物品的“描述”在上下文、措辞、结构等方面将完全不同。 我可以手动进入excel并根据包含“optiplex 9010”的内容进行筛选,然后用简单的描述替换所有内容,对macbooks等也可以这样做

我想可能有更简单的方法使用pandas/python.str.contains和.str.replace


希望额外的信息有帮助!让我知道

str.replace采用正则表达式,例如“
macbook air 11”
后跟任何字符(
)的零(或更多)(
*
)(您也可以标记为不区分大小写):

在正则表达式上可以找到一点底漆

但是,您最好规范化名称,尤其是如果您已经有一个完整的主题列表(例如,使用fuzzywuzzy,如下所示):


你可以像这样在熊猫系列中使用正则表达式

首先创建一系列哑字符串:

>>> 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
然后使用正则表达式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
当然,如果只想替换全部,可以使用正则表达式或字符串替换:

>>> 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

这是一个可以使用正则表达式解决的问题的完美示例。我还发现,像这样的情况是了解他们的好借口!这里有一个非常详细的关于如何使用正则表达式的教程

这些字符串有什么一致性吗?您可以始终使用前3个单词,也可以使用分隔符分隔,等等。。。但是如果它们总是不同的,你可能需要为每一个创建特殊的规则,为什么不在那一点上修改它们呢?我认为正则表达式可能不是确定它在哪个主题中的正确方法,不过,您可能可以侥幸逃脱……您最好构建一个dict,用所需的替换字符串保存缩减/规范化的键值,然后通过缩减/规范化来解析当前字符串值,然后在dict上执行查找,并用dict值替换当前值。这与部分字符串匹配在搜索引擎中执行的操作没有什么不同。这不是基本的东西。您可能需要使用类似nltk或类似的库来执行初始匹配。有趣的是,我如何让它替换单元格中的所有内容……基本上是删除内容,然后放回我想要的内容。我看到所有的1都被5替换了,但我想要的是所有有1的东西都被5替换,所以10变成5,11变成5,而不是55,等等,必须相应地做正则表达式。太棒了!我遗漏了表示单元格中“一切”的正则表达式符号,这非常有用。谢谢!我如何表示“macbook air 11”之前的一切?例如,如果描述是“一台电脑macbook air 11”,我想用“macbook air 11”替换它@Alexis
*macbook air 11.*
如果可以工作(相当于包含),我建议尝试一下模糊模糊解决方案!这是一条有趣的路线,我一定会看一看的,谢谢
>>> 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
>>> 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