2016-09-29 3 views
3

특정 부분 문자열을 포함하는 모든 문자열을 대체하고 싶습니다. (에서팬더에 부분 문자열이 포함되어 있으면 전체 문자열을 대체하십시오.

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

내가 비록 원하는 것은 ball을 포함 모든 것을 대체하는 것입니다 : 나는 문자열이 같은 '공을 스포츠'와 함께 축구를 대체 할 수

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

: 그래서 예를 들어 나는이 dataframe이있는 경우 이 경우 footballbasketball)와 '볼 스포츠'가 있습니다. 이런 식으로 뭔가 :

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

답변

5
당신은 '볼'가 포함 된 행을 마스크 한 다음 새 값으로 덮어 str.contains을 사용할 수 있습니다

:

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 

는 대소 문자를 구별 패스 '의 경우 만들려면 = 거짓 :

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

감사 : D이 방법은 대소 문자를 구분합니다. 그것을 바꿀 수있는 방법이 있을까요? – sk8r

+0

은'case = False'를 패스합니다 :'df [ 'sport']. str.contains ('ball', case = False)' – EdChum

+0

좋은 해결책 이네, 도와 줘서 고마워! – sk8r

3

람다와 함께 apply을 사용할 수 있습니다. 람다 함수의 x 매개 변수는 '스포츠'열에서 각 값을 될 것입니다 :

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

작은 통지 추가 - df.sport에'None'이 아닌 경우 작동합니다. – jezrael

2

당신이

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

enter image description here

+0

타이밍을 추가 할 수 있습니까? – jezrael

+0

고마워 작동 :) 대/소문자를 구분하지 않도록 정규식을 어떻게 변경할 수 있습니까? – sk8r

0

으로 재 할당 str.replace

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

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

사용할 수 있습니다 다른 str.contains

df['support'][df.name.str.contains('ball')] = 'ball support' 
관련 문제