2016-09-29 3 views
3

特定の部分文字列を含むすべての文字列を置換したいと考えています。だから私は、このデータフレームがある場合、たとえば:パンダに部分文字列が含まれている場合は文字列全体を置換してください

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

を私はこのような文字列「ボールスポーツ」でサッカーを置き換えることができます:

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

何を私もしたいことはball(中に含まれているすべてのものを交換することですこの場合はfootballbasketball)に「ボールスポーツ」が付いています。このような何か:

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

答えて

5

あなたが「ボール」を含む行をマスクするstr.containsを使用して、新しい値で上書きすることができます:それは、大文字と小文字を区別しないパス `ケース= Falseを作るために

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' 
関連する問題