Заменить всю строку, если она содержит подстроку в pandas

#python #pandas

#python #pandas

Вопрос:

Я хочу заменить все строки, содержащие определенную подстроку. Так, например, если у меня есть этот фрейм данных:

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

Я мог бы заменить футбол строкой «ball sport» следующим образом:

 df.replace({'sport': {'football': 'ball sport'}})
  

Однако я хочу заменить все, что содержит ball (в данном случае football и basketball ), на «ball sport». Что-то вроде этого:

 df.replace({'sport': {'[strings that contain ball]': 'ball sport'}})
  

Ответ №1:

Вы можете использовать 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
  

Чтобы сделать ее нечувствительной к регистру, передайте `case=False:

 df.loc[df['sport'].str.contains('ball', case=False), 'sport'] = 'ball sport'
  

Комментарии:

1. .contains также принимает регулярные выражения, поэтому вы можете добавить флаг без учета регистра в строку вместо передачи case=False , например: .str.contains(r'(?i)ball') .

Ответ №2:

Вы можете использовать apply с лямбда. x Параметром лямбда-функции будет каждое значение в столбце ‘sport’:

 df.sport = df.sport.apply(lambda x: 'ball sport' if 'ball' in x else x)
  

Ответ №3:

вы можете использовать str.replace

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

0        tennis
1    ball sport
2    ball sport
Name: sport, dtype: object
  

переназначить с помощью

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

введите описание изображения здесь

Ответ №4:

Другой str.contains

  df['support'][df.name.str.contains('ball')] = 'ball support'
  

Ответ №5:

Вы также можете использовать лямбда-функцию:

 data  = {"number": [1, 2, 3, 4, 5], "function": ['IT', 'IT application', 
'IT digital', 'other', 'Digital'] }
df = pd.DataFrame(data)  
df.function = df.function.apply(lambda x: 'IT' if 'IT' in x else x)