2016-11-16 1 views
1

Моя выборка данных:Как заменить определенную пунктуацию новым именем?

 comment sarc_majority 
0  [?, ?]   sarc 
1   [0]  non-sarc 
2  [!, !, !]   sarc 
3   [0]  non-sarc 
4   [?]   sarc 

Я хочу, чтобы заменить знаки препинания с новым именем. Такие как ? = punct1,! = punct2, '= punct3. Я попытался использовать чтение из csv-файла.

replace_df = pd.read_csv('./final/eng-mly-punct.csv', sep=',', quoting=csv.QUOTE_NONE, 
         names=["punct", "replacer"]) 
replace_df.head() 

    punct replacer 
0 ?  punct1 
1 !  punct2 
2 '  punct3 

Тогда я stucked на замену:

for punct, replacer in replace_df.itertuples(index=False,name=None): 
    df.comment = df.comment.str.replace(r'\b{0}\b'.format(punct),replacer) 

Ошибка является: ошибка: ничего не повторять

Что пошло не так? Или есть ли способ сделать это? Желательный результат должен быть точно так же как:

     comment sarc_majority 
0    [punct1, punct1]   sarc 
1       [0]  non-sarc 
2  [punct2, punct2, punct2]   sarc 
3       [0]  non-sarc 
4      [punct1]   sarc 

Спасибо заранее. Приветствия.

+0

попробуйте использовать пакет 're'. 're.sub (r '\?', punct1, text)' –

+0

Спасибо @RohanAmrute за ваш ответ. Это то, о чем я сейчас думаю. Но давайте попробуем str.replace. –

ответ

1

Вы можете использовать replace по Словаре d - но нужно бежать ? в \?:

d = {'\?':'punct1','!':'punct2',"'":'punct3'} 
df.comment = df.comment.replace(d, regex=True) 
print (df) 
        comment sarc_majority 
0   [punct1, punct1]   sarc 
1      [0]  non-sarc 
2 [punct2, punct2, punct2]   sarc 
3      [0]  non-sarc 
4     [punct1]   sarc 

Также вы можете создать d из replace_df:

df = pd.DataFrame({'comment': {0: '[?, ?]', 1: '[0]', 2: '[!, !, !]', 3: '[0]', 4: '[?]'}, 'sarc_majority': {0: 'sarc', 1: 'non-sarc', 2: 'sarc', 3: 'non-sarc', 4: 'sarc'}}) 
print (df) 
    comment sarc_majority 
0  [?, ?]   sarc 
1  [0]  non-sarc 
2 [!, !, !]   sarc 
3  [0]  non-sarc 
4  [?]   sarc 

replace_df = pd.DataFrame({'replacer': {0: 'punct1', 1: 'punct2', 2: 'punct3'}, 'punct': {0: '?', 1: '!', 2: "'"}}) 
print (replace_df) 
    punct replacer 
0  ? punct1 
1  ! punct2 
2  ' punct3 
replace_df.punct = '\\' + replace_df.punct 
d = replace_df.set_index('punct')['replacer'].to_dict() 
print (d) 
{'\\!': 'punct2', "\\'": 'punct3', '\\?': 'punct1'} 

df.comment = df.comment.replace(d, regex=True) 
print (df) 
        comment sarc_majority 
0   [punct1, punct1]   sarc 
1      [0]  non-sarc 
2 [punct2, punct2, punct2]   sarc 
3      [0]  non-sarc 
4     [punct1]   sarc 

EDIT комментарием:

df = pd.DataFrame({'comment':[['?', '?'],[0], ['!', '!', '!'], [0], ['?']], 'sarc_majority': [ 'sarc','non-sarc', 'sarc', 'non-sarc','sarc']}) 
print (df) 
    comment sarc_majority 
0  [?, ?]   sarc 
1  [0]  non-sarc 
2 [!, !, !]   sarc 
3  [0]  non-sarc 
4  [?]   sarc 

print (type(df.ix[0,'comment'])) 
<class 'list'> 

replace_df = pd.DataFrame({'replacer': {0: 'punct1', 1: 'punct2', 2: 'punct3'}, 'punct': {0: '?', 1: '!', 2: "'"}}) 
#print (replace_df) 

replace_df.punct = '\\' + replace_df.punct.apply(lambda x: x.format()) 
d = replace_df.set_index('punct')['replacer'].to_dict() 
print (d) 
{'\\!': 'punct2', "\\'": 'punct3', '\\?': 'punct1'} 

df.comment = df.comment.apply(lambda x: pd.Series(x).astype(str).replace(d, regex=True).tolist()) 
print (df) 
        comment sarc_majority 
0   [punct1, punct1]   sarc 
1      [0]  non-sarc 
2 [punct2, punct2, punct2]   sarc 
3      [0]  non-sarc 
4     [punct1]   sarc 
+0

какая у вас панда версия? – jezrael

+0

Или, может быть, у вас есть список в столбце комментариев, что возвращает 'print (type (df.ix [0, 'comment']))'? – jezrael

+0

Спасибо, @jezrael за вашу помощь. Я пробовал, но он все равно возвращает те же символы пунктуации, ни один не был заменен :-(Я прочитал сообщение о re.sub для regex [здесь] (http://stackoverflow.com/questions/16720541/python-string- replace-regular-expression). Связано ли это со мной сейчас? –

1

Большинство символов пунктуации имеют особое значение в регулярных выражениях. Здесь вы заканчиваете, например: \b?\b, что означает необязательную границу, за которой следует граница. Не то, что вы имели в виду.

Для прохождения произвольных строк в регулярное выражение, оно должно быть экранированы с помощью re.escape:

import re 
r'\b{0}\b'.format(re.escape(punct)) 

Это будет \b\?\b, что означает границу, за которой следует ?, а затем другим краем.

+1

'\ b' не является пустым, это граница между символами слова и символами, отличными от слова. – cco

+0

@cco> ты прав, о чем я думал. Редактирование. – spectras

+0

Спасибо @spectras. Я пытался и возвращаю AttributeError: могу использовать только .str аксессуар со строковыми значениями, которые используют np.object_ dtype в pandas –