2015-10-09 20 views
6

これは非常に基本的な質問かもしれないので、私は新しいpythonです。私はラムダを使用して、パンダデータフレームの各行の句読点を削除しようとしています。私は以下を使用しましたが、エラーが発生しました。 dfをリストに変換してから、新しいリストにその結果を追加してからdfに変換するのを避けようとしています。パンダのデータフレーム内の各行の句読点を削除する

ご意見をお寄せください。

import string 

df['cleaned'] = df['old'].apply(lambda x: x.replace(c,'') for c in string.punctuation) 

答えて

11

string.punctuationではなく、データフレーム内の文字列を反復処理する必要があります。また、.join()を使用して文字列のバックアップを作成する必要があります。

df['cleaned'] = df['old'].apply(lambda x:''.join([i for i in x 
                if i not in string.punctuation])) 

ラムダ式がそのように長くなると、関数定義を別々に書き出すほうが読みやすくなります。 (最適化のヒントについては@AndyHaydenのおかげ):

def remove_punctuation(s): 
    s = ''.join([i for i in s if i not in frozenset(string.punctuation)]) 
    return s 

df['cleaned'] = df['old'].apply(remove_punctuation) 
+0

非常に素晴らしいです!ありがとう! – RJL

+0

大歓迎です! – bernie

+0

あなたの答えがあればそれを受け入れることができます。 –

4

正規表現を使用するには、最も可能性の高い速くここになります:

In [11]: RE_PUNCTUATION = '|'.join([re.escape(x) for x in string.punctuation]) # perhaps this is available in the re/regex library? 

In [12]: s = pd.Series(["a..b", "c<=d", "e|}f"]) 

In [13]: s.str.replace(RE_PUNCTUATION, "") 
Out[13]: 
0 ab 
1 cd 
2 ef 
dtype: object 
+1

これは受け入れられる回答でなければなりません... – clg4

+1

同様に: 's.str.replace( '[{}]'。書式(string.punctuation)、 '')' –

関連する問題