如果整个字符串包含pandas中的子字符串,则替换它

nic*_*iol 18 python pandas

我想替换包含特定子字符串的所有字符串.例如,如果我有这个数据帧:

import pandas as pd
df = pd.DataFrame({'name': ['Bob', 'Jane', 'Alice'], 
                   'sport': ['tennis', 'football', 'basketball']})
Run Code Online (Sandbox Code Playgroud)

我可以用这样的字符串'ball sport'替换足球:

df.replace({'sport': {'football': 'ball sport'}})
Run Code Online (Sandbox Code Playgroud)

我想,虽然是替换包含所有ball(在这种情况下footballbasketball)与"球运动".像这样的东西:

df.replace({'sport': {'[strings that contain ball]': 'ball sport'}})
Run Code Online (Sandbox Code Playgroud)

EdC*_*ica 25

您可以使用str.contains屏蔽包含'ball'的行,然后使用新值覆盖:

In [71]:
df.loc[df['sport'].str.contains('ball'), 'sport'] = 'ball sport'
df

Out[71]:
    name       sport
0    Bob      tennis
1   Jane  ball sport
2  Alice  ball sport
Run Code Online (Sandbox Code Playgroud)

为了使它不区分大小写传递`case = False:

df.loc[df['sport'].str.contains('ball', case=False), 'sport'] = 'ball sport'
Run Code Online (Sandbox Code Playgroud)

  • `.contains` 也接受正则表达式,因此您可以将不区分大小写的标志添加到字符串中,而不是传递 `case=False`,例如: `.str.contains(r'(?i)ball')`。 (2认同)

piR*_*red 11

您可以使用 str.replace

df.sport.str.replace(r'(^.*ball.*$)', 'ball sport')

0        tennis
1    ball sport
2    ball sport
Name: sport, dtype: object
Run Code Online (Sandbox Code Playgroud)

重新分配

df['sport'] = df.sport.str.replace(r'(^.*ball.*$)', 'ball sport')
df
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


Dee*_*ace 9

您可以使用applylambda。xlambda函数的参数将是“运动”列中的每个值:

df.sport = df.sport.apply(lambda x: 'ball sport' if 'ball' in x else x)
Run Code Online (Sandbox Code Playgroud)