我有一个Pandas数据框,其中一列包含文本。我想得到整个列中出现的唯一单词列表(空格是唯一的分割)。
import pandas as pd
r1=['My nickname is ft.jgt','Someone is going to my place']
df=pd.DataFrame(r1,columns=['text'])
输出应如下所示:
['my','nickname','is','ft.jgt','someone','going','to','place']
获得计数也没有坏处,但这不是必需的。
答案 0 :(得分:47)
使用set
创建唯一元素序列。
在df
上进行一些清理,以获得小写字符串并分割:
df['text'].str.lower().str.split()
Out[43]:
0 [my, nickname, is, ft.jgt]
1 [someone, is, going, to, my, place]
此列中的每个列表都可以传递给set.update
函数以获取唯一值。使用apply
执行此操作:
results = set()
df['text'].str.lower().str.split().apply(results.update)
print results
set(['someone', 'ft.jgt', 'my', 'is', 'to', 'going', 'place', 'nickname'])
答案 1 :(得分:23)
使用collections.Counter
:
>>> from collections import Counter
>>> r1=['My nickname is ft.jgt','Someone is going to my place']
>>> Counter(" ".join(r1).split(" ")).items()
[('Someone', 1), ('ft.jgt', 1), ('My', 1), ('is', 2), ('to', 1), ('going', 1), ('place', 1), ('my', 1), ('nickname', 1)]
答案 2 :(得分:19)
如果您想从DataFrame构造中执行此操作:
import pandas as pd
r1=['My nickname is ft.jgt','Someone is going to my place']
df=pd.DataFrame(r1,columns=['text'])
df.text.apply(lambda x: pd.value_counts(x.split(" "))).sum(axis = 0)
My 1
Someone 1
ft.jgt 1
going 1
is 2
my 1
nickname 1
place 1
to 1
dtype: float64
如果您想要更灵活的标记化,请使用nltk
及其tokenize
答案 3 :(得分:8)
以@Ofir以色列的答案为基础,特别针对熊猫:
from collections import Counter
result = Counter(" ".join(df['text'].values.tolist()).split(" ")).items()
result
将为您提供所需内容,将文本列系列值转换为列表,拆分空格并计算实例。
答案 4 :(得分:1)
uniqueWords = list(set(" ".join(r1).lower().split(" ")))
count = len(uniqueWords)
答案 5 :(得分:1)
除了增加讨论之外,以下是在92816行数据帧上三种建议的解决方案的时间(跳过转换为列表):
from collections import Counter
results = set()
%timeit -n 10 set(" ".join(df['description'].values.tolist()).lower().split(" "))
每个循环323 ms±4.46 ms(平均±标准偏差,共运行7次,每个循环10个循环)
%timeit -n 10 df['description'].str.lower().str.split(" ").apply(results.update)
每个循环316毫秒±4.22毫秒(平均±标准偏差,共运行7次,每个循环10个循环)
%timeit -n 10 Counter(" ".join(df['description'].str.lower().values.tolist()).split(" "))
365 ms±2.5 ms每个循环(平均±标准偏差,共运行7次,每个循环10个循环)
len(list(set(" ".join(df['description'].values.tolist()).lower().split(" "))))
13561
len(results)
13561
len(Counter(" ".join(df['description'].str.lower().values.tolist()).split(" ")).items())
13561
我也尝试了仅使用Pandas的方法,但是花费了更长的时间,并且使用了超过25GB的RAM来交换32GB笔记本电脑。
所有其他都很快。我会使用解决方案1来作为一个班轮,如果需要字数统计,则使用3。
答案 6 :(得分:0)
根据v0.14.0
文档(撰写本文时提示稳定版本),DataFrame.describe()
将返回此类统计信息(在另一个数据框中)。
请注意,对于numeric
数据类型的列,返回的唯一值的数量不,但应为string
列返回,例如相关的列。< / p>
答案 7 :(得分:0)
使用collections.Counter
来获取数据帧中的列中唯一词的计数(无停用词)
给出:
$ cat test.csv
Description
crazy mind california medical service data base...
california licensed producer recreational & medic...
silicon valley data clients live beyond status...
mycrazynotes inc. announces $144.6 million expans...
leading provider sustainable energy company prod ...
livefreecompany founded 2005, listed new york stock...
代码:
from collections import Counter
from string import punctuation
import pandas as pd
from nltk.corpus import stopwords
from nltk import word_tokenize
stoplist = set(stopwords.words('english') + list(punctuation))
df = pd.read_csv("test.csv", sep='\t')
texts = df['Description'].str.lower()
word_counts = Counter(word_tokenize('\n'.join(texts)))
word_count.most_common()
[输出]:
[('...', 6), ('california', 2), ('data', 2), ('crazy', 1), ('mind', 1), ('medical', 1), ('service', 1), ('base', 1), ('licensed', 1), ('producer', 1), ('recreational', 1), ('&', 1), ('medic', 1), ('silicon', 1), ('valley', 1), ('clients', 1), ('live', 1), ('beyond', 1), ('status', 1), ('mycrazynotes', 1), ('inc.', 1), ('announces', 1), ('$', 1), ('144.6', 1), ('million', 1), ('expans', 1), ('leading', 1), ('provider', 1), ('sustainable', 1), ('energy', 1), ('company', 1), ('prod', 1), ('livefreecompany', 1), ('founded', 1), ('2005', 1), (',', 1), ('listed', 1), ('new', 1), ('york', 1), ('stock', 1)]
答案 8 :(得分:-1)
如果数据框具有'a','b','c'等,则列And要计算每列的不同单词,则 您可以使用,
Counter(dataframe['a']).items()