python:如何清理csv文件

时间:2019-09-17 18:21:02

标签: python csv

我是Python的初学者,想清理csv文件以进行分析。但是,我面临着代码问题。

def open_dataset(file_name):
    opened_file = open(file_name)
    read_file = reader(opened_file, delimiter=",")
    data = list(read_file)

    return data


def column(filename):
    filename = open_dataset(filename)

    for row in filename:
        print(row)

使用上面的代码,输出类似于

['Name;Product;Sales;Country;Website']
[';Milk;30;Germany;something.com']
[';;;USA;']
['Chris;Milk;40;;']

我希望获得以下输出:

['Name','Product','Sales','Country','Website']
[NaN,'Milk','30','Germany','something.com']
[NaN,NaN,NaN,'USA',NaN]
['Chris','Milk',40,NaN,NaN]

我将定界符定义为“,”,但仍为“;”用过的。我不知道为什么会这样。另外,即使我尝试用“ NaN”替换该空格,但仍然每个空格都被“ NaN”替换。

如果有人可以给我提示,将不胜感激

毕竟,我想分析每一列,例如“ NaN”的百分比等。

谢谢!

4 个答案:

答案 0 :(得分:0)

您需要指定正确的定界符:

    read_file = reader(opened_file, delimiter=";")

您的CSV文件似乎使用的是分号而不是逗号,因此您需要告诉reader()使用什么。

提示:

filename = open_dataset(filename)

不要重新分配变量以表示其他含义。在执行此行之前,filename是一个字符串,其中包含要打开的文件的名称。完成此分配后,filename现在是文件中的行列表。请改用其他变量名:

rows = open_dataset(filename)

现在,这两个变量是不同的,它们的含义在名称中也很清楚。当然,可以随意使用rows以外的filename以外的其他东西。

答案 1 :(得分:0)

您可以通过以下方式获得所需的结果:

  • 指定“;”作为构造阅读器对象时的分隔符
  • 通过将空单元格转换为“ NaN”(或您选择的其他值)的函数传递每一行

以下是一些示例代码:

import csv 


def row_factory(row):
    return [x if x != '' else 'NaN' for x in row]


with open(filename, 'r', newline='') as f:
    reader = csv.reader(f, delimiter=';')
    for row in reader:
        print(row_factory(row))

输出:

['Name', 'Product', 'Sales', 'Country', 'Website']
['NaN', 'Milk', '30', 'Germany', 'something.com']
['NaN', 'NaN', 'NaN', 'USA', 'NaN']
['Chris', 'Milk', '40', 'NaN', 'NaN']

答案 2 :(得分:-1)

您可能想研究使用熊猫。它可以简化数据处理,甚至可以读取多种文件格式。

如果您想阅读c​​sv:

import pandas as pd:
    my_file = '/pat/to/my_csv.csv'
    pd.read_csv(my_file)

答案 3 :(得分:-2)

这是因为列表仅包含一个元素,并且该元素是单个字符串,为了将字符串解析为列表,您可以将其拆分。

这应该可以满足您的需求

for row in filename:
  parsed_row = row[0].split(';')
  for i in range(0, len(parsed_row)):
    if parsed_row[i] == '':
      parsed_row[i] = None
  print(parsed_row)

我给你一个Repl.it example