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