Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将CSV文件中的列转换为Python中的单词直方图_Python_Csv - Fatal编程技术网

将CSV文件中的列转换为Python中的单词直方图

将CSV文件中的列转换为Python中的单词直方图,python,csv,Python,Csv,我有一个包含两列的CSV文件,它们没有标题/标题。我想忽略第一列,并使用第二列(第[1]行)生成词频直方图 但是每个条目都包含多个单词和其他代码,我在这里看到的答案将每个条目视为一个字符串,因此我的柱状图的每个条都有相同的值,因为每个字符串在文件中出现一次。我也尝试过将所有的行[1]添加到一个列表中,但是这也不起作用,并且所有的条都有相同的高度。我想根据数据制作柱状图,例如: positive This dress is great negative This coat is t

我有一个包含两列的CSV文件,它们没有标题/标题。我想忽略第一列,并使用第二列(第[1]行)生成词频直方图

但是每个条目都包含多个单词和其他代码,我在这里看到的答案将每个条目视为一个字符串,因此我的柱状图的每个条都有相同的值,因为每个字符串在文件中出现一次。我也尝试过将所有的行[1]添加到一个列表中,但是这也不起作用,并且所有的条都有相同的高度。我想根据数据制作柱状图,例如:

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))