2016-12-15 12 views
0

我幾乎可以肯定,我忽略了一些非常明顯的東西,所以我問這個問題,希望能夠感到尷尬:我有一個pandas數據框,其中有2000多個文本一列。我最初的目標是,並且仍然是計算每個文本中的單詞,並在該單詞數量的數據框中創建一個新列。Python:返回2000個文本列表中的字數

在努力簡化問題,我拿出文本列到使用字符串列表如下:

texts = data.text.tolist() 

類型是list和列表的len是2113,這是數據幀中的行數。我目前的努力是:

word_counts = [] 
for text in texts: 
    count = len(re.findall(r"[a-zA-Z_]+", text)) 
    word_counts.append(count) 

對於我收到:TypeError: expected string or buffer

如果我運行一個單獨的文本的評價:

len(re.findall(r"[a-zA-Z_]+", texts[0])) 

我得到預期的結果:2176

什麼我沒有看到?

編輯添加樣品:

texts[0].split()[:10] 

['Thank', 'you', 'so', 'much', 'Chris.', 'And', 
"it's", 'truly', 'a', 'great'] 

這些都是會談的成績單,所以一些標點符號,也許是幾號。

+0

你能粘貼在這裏你的文章的一些例子嗎?對不起,但我很困惑爲什麼「TypeError:預期的字符串或緩衝區」發生 – linpingta

+0

你的文本中是否有下劃線或破折號?或者空格分隔每個單詞? – Jakub

回答

1

您可以創建一個函數來返回每個字符串的len,並將該函數應用於包含字符串的pd.Series

data = pd.DataFrame(
    {'text': ["This is-four words.", "This is five whole words."]}) 
data 
# text 
# 0 This is-four words. 
# 1 This is five whole words. 

def count_words(cell): 
    try: 
     return len(re.findall(r"[a-zA-Z_]+", cell)) 
    except AttributeError: 
     return cell 

data['word_count'] = data['text'].apply(count_words) 
data 

# text      word_count 
# 0 This is-four words.   4 
# 1 This is five whole words. 5 

但是,如果你知道,在每個文本的文字,只有空白(即不通過下劃線或破折號)分離,然後我會推薦這個方法:

def count_words2(cell): 
    try: 
     return len(cell.split()) 
    except TypeError: 
     return cell 

count_words3 = lambda x: len(str(x).split()) 

它比使用正則表達式要快得多。在Jupyter筆記本:

test_str = "test " * 1000 
%timeit count_words(test_str) 
%timeit count_words2(test_str) 
%timeit count_words3(test_str) 
# 10000 loops, best of 3: 158 µs per loop 
# 10000 loops, best of 3: 29.8 µs per loop 
# 10000 loops, best of 3: 28.7 µs per loop 
+0

我現在正在看這個,並試用它...在我的Jupyter筆記本。 (你在我的研究中嗎?) –

+0

我確信這是答案。我收到以下錯誤:' - > 210 return _compile(pattern,flags).findall(string) 212 if sys.hexversion> = 0x02020000: TypeError:預期的字符串或緩衝區... ...和我在想,我可能會有一些文本引起這個呃逆。 (這可能嗎?) –

+0

你確定'string'實際上是類型'str'嗎?它看起來像是別的東西。也許是一個列表? – Jakub

1

我認爲,你不必使用正則表達式,並不需要輸出值列表。您可以嘗試使用lambda函數:

df = pd.DataFrame({'col1': ['Hello world', 'Hello, there world', 'Hello']}) 
     col1 
0  Hello world 
1 Hello there world 
2    Hello 

然後,你可以只使用一個lambda功能。

df['count'] = df['col1'].apply(lambda x: len(str(x).split())) 
     col1   count 
0  Hello world  2 
1 Hello there world  3 
2    Hello  1 

或者,如果你想使用regex,你仍然可以使用lambda功能:

df['count'] = df['col1'].apply(lambda x: len(re.findall(r"[a-zA-Z_]+", x))) 
col1   count 
    0  Hello world  2 
    1 Hello there world  3 
    2    Hello  1 
+0

這隻有在所有單詞用空白分隔時纔有效。如果兩個單詞之間有連字符,則此方法會將其視爲一個單詞。不確定那是OP想要的。 – Jakub

+0

@Jakub我不是英語語法方面的專家,但我確信連詞連接詞(我認爲它們被稱爲複合形容詞)應該被計爲一個詞,而不是兩個。我認爲下劃線也是如此。無論如何,我的答案還包括lambda函數中的正則表達式解決方案。 –

相關問題