将CSV文件中的列转换为Python中的单词直方图
我有一个包含两列的CSV文件,它们没有标题/标题。我想忽略第一列,并使用第二列(第[1]行)生成词频直方图 但是每个条目都包含多个单词和其他代码,我在这里看到的答案将每个条目视为一个字符串,因此我的柱状图的每个条都有相同的值,因为每个字符串在文件中出现一次。我也尝试过将所有的行[1]添加到一个列表中,但是这也不起作用,并且所有的条都有相同的高度。我想根据数据制作柱状图,例如:将CSV文件中的列转换为Python中的单词直方图,python,csv,Python,Csv,我有一个包含两列的CSV文件,它们没有标题/标题。我想忽略第一列,并使用第二列(第[1]行)生成词频直方图 但是每个条目都包含多个单词和其他代码,我在这里看到的答案将每个条目视为一个字符串,因此我的柱状图的每个条都有相同的值,因为每个字符串在文件中出现一次。我也尝试过将所有的行[1]添加到一个列表中,但是这也不起作用,并且所有的条都有相同的高度。我想根据数据制作柱状图,例如: positive This dress is great negative This coat is t
positive This dress is great
negative This coat is terrible
neutral That dress was ok
希望直方图条的值为
This:2 is:2 dress:2 great:1 etc
选项1
结合使用
csv
模块和集合。计数器
对象:
import csv
from collections import Counter
data = []
with open('data.csv') as f:
data = [word for row in csv.reader(f) for word in row[1].lower().split()]
counts = Counter(data)
选项2
使用
熊猫
。以系列
的形式加载数据,使用header=False指定无头
,并使用usecols=[1]
忽略第一列(忽略第0列)
接下来,在空格上调用str.split
,stack
列,然后调用value\u counts
:
s.str.lower().str.split(None, expand=True).stack().value_counts()
this 2
dress 2
is 2
coat 1
ok 1
was 1
great 1
terrible 1
that 1
dtype: int64
只想补充一点,如果文件很大(真的很大),你可以逐行读取它。试试这个代码。它在分割时将多个空格视为一个空格,并允许您忽略大小写
from collections import defaultdict
import re
def read_string_column(csv_file,delimiter=','):
"""
Read the file line by line
"""
line = '1'
while line:
line = csv_file.readline()
if len(line.split(delimiter))<2:
continue
yield line.split(delimiter)[1]
def add_word_counts(word_dict,new_words):
"""
Add word counts to a defaultdict
"""
for word in new_words:
if word:
word_dict[word]+=1
def count_words(csv_file,delimiter=',',ignore_case=True):
"""
Count words.
delimiter - csv file delimiter
ignore_case - if True, the text will be read in a lower case
"""
result_dict = defaultdict(int)
if ignore_case:
for words in read_string_column(csv_file,delimiter):
add_word_counts(result_dict,re.split('\s+',words.lower().strip()))
else:
for words in read_string_column(csv_file,delimiter):
add_word_counts(result_dict,re.split('\s+',words.strip()))
return result_dict
if __name__=='__main__':
f = open('1.csv','r')
print(count_words(f,ignore_case=True))
从集合导入defaultdict
进口稀土
def read_string_列(csv_文件,分隔符=','):
"""
逐行读取文件
"""
行='1'
while line:
line=csv_文件。readline()
如果len(line.split(delimiter))正在使用pandas?@cᴏʟᴅsᴘᴇᴇᴅ 我尝试过使用pandas是的,这给了我不正确的结果collections.Counter(读卡器中的逐行逐行逐行,逐行[1].split())
from collections import defaultdict
import re
def read_string_column(csv_file,delimiter=','):
"""
Read the file line by line
"""
line = '1'
while line:
line = csv_file.readline()
if len(line.split(delimiter))<2:
continue
yield line.split(delimiter)[1]
def add_word_counts(word_dict,new_words):
"""
Add word counts to a defaultdict
"""
for word in new_words:
if word:
word_dict[word]+=1
def count_words(csv_file,delimiter=',',ignore_case=True):
"""
Count words.
delimiter - csv file delimiter
ignore_case - if True, the text will be read in a lower case
"""
result_dict = defaultdict(int)
if ignore_case:
for words in read_string_column(csv_file,delimiter):
add_word_counts(result_dict,re.split('\s+',words.lower().strip()))
else:
for words in read_string_column(csv_file,delimiter):
add_word_counts(result_dict,re.split('\s+',words.strip()))
return result_dict
if __name__=='__main__':
f = open('1.csv','r')
print(count_words(f,ignore_case=True))