2017-03-31 24 views
1

我正嘗試從熊貓系列中的每個標量值中移除少於4個字符的所有單詞。什麼是最好的方式來做到這一點?這裏是我的失敗嘗試:從熊貓系列中刪除少於4個字符的單詞

df['text'] = df['text'].str.join(word for word in df['text'].str.split() if len(word)>3) 

我收到以下錯誤信息:

AttributeError: 'generator' object has no attribute 'join'

我根據我嘗試過關於一個字符串,則這個帖子:Remove small words using Python

附註:如果在刪除少於4個字符之前更好地標記我的單詞,請讓我知道。

編輯:每個標量值包含句子,所以我想刪除任何單詞長度小於4的值。

+0

我會考慮接受@piRSquared的解決方案。我覺得這更像是「潘多祿」。不過,獲得一些性能比較會很有趣,並讓最快的勝利! –

回答

2

使用正則表達式似乎是最快的:

df['text'].str.findall('\w{4,}').str.join(' ') 

時序

使用以下設置:

df = pd.DataFrame({'text':["The quick brown fox", "jumped over the lazy dog", "foo bar baz", 'words exceeding desired length']}) 
df = pd.concat([df]*10**4, ignore_index=True) 

def pir2(df): 
    t = df.text.str.split(expand=True).stack() 
    return t.loc[t.str.len() >= 4].groupby(level=0).apply(' '.join) 

我得到以下計時:

%timeit df['text'].str.findall('\w{4,}').str.join(' ') 
10 loops, best of 3: 44.8 ms per loop 

%timeit df.text.apply(lambda i: ' '.join(filter(lambda j: len(j) > 3, i.split()))) 
10 loops, best of 3: 79.3 ms per loop 

%timeit df['text'].str.split().map(lambda sl: " ".join(s for s in sl if len(s) > 3)) 
10 loops, best of 3: 87.2 ms per loop 

%timeit pir2(df) 
1 loop, best of 3: 2.87 s per loop 
3

你可以做這樣的事情:

>>> df = pd.DataFrame({'text':["The quick brown fox", "jumped over the lazy dog"]}) 
>>> df 
         text 
0  The quick brown fox 
1 jumped over the lazy dog 
>>> df['text'].str.split().map(lambda sl: " ".join(s for s in sl if len(s) > 3)) 
0   quick brown 
1 jumped over lazy 
Name: text, dtype: object 

但說實話,我平時堅持香草蟒蛇文本處理流水線。 pandas數據結構在文本中播放不好。至少,你正在失去內存/速度優勢numpy/pandas

+1

打我吧:-) +1 – bernie

0

嘗試

df.test.apply(lambda i: ' '.join(filter(lambda j: len(j) > 3, i.split())))

1

考慮@ juanpa.arrivillaga的dataframedf

df = pd.DataFrame({'text':["The quick brown fox", "jumped over the lazy dog"]}) 

.str.findall和然後我們就可以

t = df.text.str.split(expand=True).stack() 
t.loc[t.str.len() >= 4].groupby(level=0).apply(' '.join) 

0   quick brown 
1 jumped over lazy 
dtype: object 
+1

非常好,儘管如此,直到你必須使用'apply' :(。我仍然保持'pandas'是文本預處理的錯誤工具。 –

+0

@ juanpa.arrivillaga你是什麼建議? – piRSquared

+1

Vanilla python。一旦你有一個數據幀是'object' dtype,你已經放棄了'numpy' /'pandas'的速度/內存效率,有時候這很好,因爲「panel」抽象仍然是有用的,並且有很多方便的例程被內置到'pandas'數據結構中,但是文本並不是這種情況。我的大多數文本預處理都是在香草Python中進行的,通常會導致一些稀疏表示,喂入'sklearn'向量化器以得到特徵化,稀疏的'numpy'陣列。但是*如果我打算使用熊貓,我會選擇這個:) –