2016-09-13 4 views
1

私はこのはTypeError:期待される文字列またはバイトのようなオブジェクトパンダ変数

import pandas as pd 
df = pd.DataFrame({'word': ['abs e learning ', 'abs e-learning', 'abs e&learning', 'abs elearning']}) 

のようなデータセットを持って、私はのように怒鳴る

re_map = {r'\be learning\b': 'elearning', r'\be-learning\b': 'elearning', r'\be&learning\b': 'elearning'} 
import re 
for r, map in re_map.items(): 
      df['word'] = re.sub(r, map, df['word']) 

とエラーを行う

 word 
0 abs elearning 
1 abs elearning 
2 abs elearning 
3 abs elearning 

を取得したいです

TypeError         Traceback (most recent call last) 
<ipython-input-42-fbf00d9a0cba> in <module>() 
     3 s = df['word'] 
     4 for r, map in re_map.items(): 
----> 5    df['word'] = re.sub(r, map, df['word']) 

C:\Users\Edward\Anaconda3\lib\re.py in sub(pattern, repl, string, count, flags) 
    180  a callable, it's passed the match object and must return 
    181  a replacement string to be used.""" 
--> 182  return _compile(pattern, flags).sub(repl, string, count) 
    183 
    184 def subn(pattern, repl, string, count=0, flags=0): 

TypeError: expected string or bytes-like object 

私はこの

for r, map in re_map.items(): 
      df['word'] = re.sub(r, map, str(df['word'])) 

のようにSTRを適用することができますそこには間違いはありませんが、私はそれを改善する方法を

word 
0 0 0 0 abs elearning \n1 abs elearning\...\n1 0 0 abs elearning \n1 abs elearning\...\n2 0 0 abs elearning \n1 abs ele... 
1 0 0 0 abs elearning \n1 abs elearning\...\n1 0 0 abs elearning \n1 abs elearning\...\n2 0 0 abs elearning \n1 abs ele... 
2 0 0 0 abs elearning \n1 abs elearning\...\n1 0 0 abs elearning \n1 abs elearning\...\n2 0 0 abs elearning \n1 abs ele... 
3 0 0 0 abs elearning \n1 abs elearning\...\n1 0 0 abs elearning \n1 abs elearning\...\n2 0 0 abs elearning \n1 abs ele... 

を望むように私はpd.dataFrameを得る望めませんか?

答えて

1

df['word']です。文字列に変換するだけでリストが破棄されます。

for r, map in re_map.items(): 
    d = df['word'] 
    for i,e in enumerate(d): 
     d[i] = re.sub(r, map, e) 

はところで、あなたが大幅にあなたの正規表現のリストを簡素化できます:リスト内包なし

for r, map in re_map.items(): 
    df['word'] = [re.sub(r, map, e) for e in df['word']]: 

古典代替方法:

あなたは、各メンバーに正規表現を適用する必要が

re_map = {r'\be[\-& ]learning\b': 'elearning'} 

これを行うことで正規表現が1つしかなく、これが1つのライナーになります:

df['word'] = [re.sub(r'\be[\-& ]learning\b', 'elearning', e) for e in df['word']]: 

も、すべての置換を一度正規表現をプリコンパイルすることにより、より高速のようになります。

theregex = re.compile(r'\be[\-& ]learning\b') 
df['word'] = [theregex.sub('elearning', e) for e in df['word']]: 
+0

第二の選択肢は、最高の 最初の 'はTypeError: 『です』アイテムの割り当てをサポートしていないオブジェクトのSTR – Edward

+0

トレースバックは----> 3 e [i] = re.sub(r、map、e [i]) – Edward

+0

私はそれを得ました!それを指摘してくれてありがとう。それは修正されました! –

関連する問題