Python熊猫-如何格式化和拆分列中的文本?

Python熊猫-如何格式化和拆分列中的文本?,python,pandas,text-mining,data-analysis,Python,Pandas,Text Mining,Data Analysis,我在数据帧中有一组字符串,如下所示 ID TextColumn 1 This is line number one 2 I love pandas, they are so puffy 3 [This $tring is with specia| characters, yes it is!] 我想格式化这个字符串以消除所有特殊字符 B.一旦格式化,我想得到一个唯一单词的列表(空格是唯一的分隔符) 以下是我编写的代码: get_df_by_id数据帧有一个选定的帧,比如id 3 #replac

我在数据帧中有一组字符串,如下所示

ID TextColumn
1 This is line number one
2 I love pandas, they are so puffy
3 [This $tring is with specia| characters, yes it is!]
我想格式化这个字符串以消除所有特殊字符 B.一旦格式化,我想得到一个唯一单词的列表(空格是唯一的分隔符)

以下是我编写的代码:

get_df_by_id数据帧有一个选定的帧,比如id 3

#replace all special characters
formatted_title = get_df_by_id['title'].str.replace(r'[\-\!\@\#\$\%\^\&\*\(\)\_\+\[\]\;\'\.\,\/\{\}\:\"\<\>\?]' , '')
# then split the words
results = set()
get_df_by_id['title'].str.lower().str.split().apply(results.update)
print results
预期输出应如下所示:

set([u'this', u'is', u'it', u'specia', u'tring', u'is', u'characters,', u'yes', u'with'])

为什么格式化数据框仍然保留特殊字符?

您必须将格式化值分配给同一数据框

get_df_by_id['title'] = get_df_by_id['title'].str.replace(r'[\-\!\@\#\$\%\^\&\*\(\)\_\+\[\]\;\'\.\,\/\{\}\:\"\<\>\?]' , '')
get_df_by_id['title']=get_df_by_id['title'].str.replace(r'[\-\!\\\$\%\\\\^\&*(\)\\\\\+\[\]\\\\\.\,\/\\\\\\\\:\“\?”,'')
我认为您可以先使用特殊字符(我在末尾添加
\\\
),然后使用
\s+
(任意wtitespaces)输入文本。输出为数据帧。因此您可以将其添加到
系列中,最后:

print(df['title'].str
.replace(r'[\-\!\@\\\$\%\^\&\*\(\)\\\\+\[\]\\\\'.\,\/\\\\\\:\“\\?\\\\\\\\\\\\%\\.\,”)
.str
.lower()
.str
.split(“\s+”,expand=True)
.stack()
.drop_duplicates()
.tolist())
[‘这’、‘是’、‘线’、‘数字’、‘一’、‘我’、‘爱’、‘熊猫’、‘它们’、‘是’,
‘so’、‘poffy’、‘tring’、‘with’、‘speca’、‘characters’、‘yes’、‘it’]

如果需要每行的唯一单词列表:

>>> get_df_by_id['title'].str.replace(r'[^a-zA-Z\s]', '').str.lower().str.split('\s+').apply(lambda x: list(set(x)))

0                           [this, is, one, line, number]
1                 [love, i, puffy, so, are, they, pandas]
2    [specia, this, is, it, characters, tring, yes, with]
Name: title, dtype: object

u'is'
在预期输出中重复。您是否需要列中所有字符串中的唯一单词,还是希望按行排列?原始DF中的第3个和第9个单词是“is”。“可能是设置”并没有消除重复项。感谢病毒,我尝试过它,它给出了以下错误:C:\Anaconda2\lib\site packages\ipykernel\u main\uz.py:4:SettingWithCopyWarning:试图在数据帧切片的副本上设置值。尝试使用.loc[row\u indexer,col\u indexer]=value代替它似乎只是一个警告。我猜您得到了预期的输出。您可以尝试添加pd.options.mode.chained\u assignment=None之类的设置吗
print (df['title'].str
                  .replace(r'[\-\!\@\#\$\%\^\&\*\(\)\_\+\[\]\;\'\.\,\/\{\}\:\"\<\>\?\|]','')
                  .str
                  .lower()
                  .str
                  .split('\s+', expand=True)
                  .stack()
                  .drop_duplicates()
                  .tolist())

['this', 'is', 'line', 'number', 'one', 'i', 'love', 'pandas', 'they', 'are', 
'so', 'puffy', 'tring', 'with', 'specia', 'characters', 'yes', 'it']
>>> get_df_by_id['title'].str.replace(r'[^a-zA-Z\s]', '').str.lower().str.split('\s+').apply(lambda x: list(set(x)))

0                           [this, is, one, line, number]
1                 [love, i, puffy, so, are, they, pandas]
2    [specia, this, is, it, characters, tring, yes, with]
Name: title, dtype: object