如何阅读cs

2024-10-06 11:27:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据存储在csv文件如下格式

892,3,"Kelly, Mr. James",male,34.5,0,0,330911,7.8292,,Q
893,3,"Wilkes, Mrs. James (Ellen Needs)",female,47,1,0,363272,7,,S
894,2,"Myles, Mr. Thomas Francis",male,62,0,0,240276,9.6875,,Q
895,3,"Wirz, Mr. Albert",male,27,0,0,315154,8.6625,,S
896,3,"Hirvonen, Mrs. Alexander (Helga E Lindqvist)",female,22,1,1,3101298,12.2875,,S
897,3,"Svensson, Mr. Johan Cervin",male,14,0,0,7538,9.225,,S

每个列的数据类型

^{pr2}$

第一列以892893开头。。。897应以int格式存储array。第三列,如“Wilkes,Mrs.James(Ellen Needs)”应该存储在string类型中。但是,第三列是string格式,但是字符的长度是不是固定的,也就是说,我不知道这个列中存储的字符的最大长度

我已经做到了:

 csv_file_object = csv.reader(open('trainData.csv', 'rb'))
 header = csv_file_object.next()

 data=[]
 for row in csv_file_object:
    data.append(row)
    data = np.array(data)

但是,上面的代码将所有列读为string,但其中许多不是string格式,并以string格式存储信息。另一方面,如果我使用genfromtxt,那么第三列就是问题,因为它在double quota中包含逗号。在

我希望用它自己的数据类型来存储每一列,也就是说,第一列应该存储为int类型。在

我的预期数组:

892 3 "Kelly, Mr. James" male 34.5 0 0 330911 7.8292 NaN Q
893 3 "Wilkes, Mrs. James (Ellen Needs)" female 47 1 0 363272 7 NaN S
894 2 "Myles, Mr. Thomas Francis" male 62 0 0 240276 9.6875 NaN Q
895 3 "Wirz, Mr. Albert" male 27 0 0 315154 8.6625 NaN S
896 3 "Hirvonen, Mrs. Alexander (Helga E Lindqvist)" female 22 1 1 3101298 12.2875 NaN S
897 3 "Svensson, Mr. Johan Cervin" male 14 0 0 7538 9.225 S

如您所见,如果数据不可用,NaN或其派生者应该被放入。在

我应该读什么csv文件?在


Tags: csvdatastringobject格式nanmalefemale
3条回答

我不太清楚你的意思,但我想这对你有用。在

我实现了另外两个函数来决定字符串是float还是integer。在

如果这个字符串是一个空字符串,我没有写,不过,你可以把它改成任何你喜欢的。在

import csv
import numpy as np

def isfloat(x):
    try:
        a = float(x)
    except ValueError:
        return False
    else:
        return True

def isint(x):
    try:
        a = float(x)
        b = int(a)
    except ValueError:
        return False
    else:
        return a == b


csv_file_object = csv.reader(open('trainData.csv', 'rb'))
header = csv_file_object

data=[]
for row in csv_file_object:
    for index, cell in enumerate(row):
        if isint(cell):
            row[index] = int(cell)
        elif isfloat(cell):
            row[index] = float(cell)
        if not cell: # cell == ''
            row[index] = None  # you can change the value to whatever you like.
    data.append(row)

print data

输出:

^{pr2}$

您可以更轻松地使用熊猫库,如下所示:

import pandas as pd

df = pd.read_csv("trainData.csv", dtype={'col1': int, 'col2': int, 'col3': str, 'col4': str, 'col5': float, 'col6':int,
                                  'col7': int, 'col8': float, 'col9':float, 'col10': str, 'col11': str})
df = map(list, df.values)
print df

输出:

^{pr2}$

csv文件应该如下所示,因为第一行是列名

col1,col2,col3,col4,col5,col6,col7,col8,col9,col10,col11
892,3,"Kelly, Mr. James",male,34.5,0,0,330911,7.8292,,Q
893,3,"Wilkes, Mrs. James (Ellen Needs)",female,47,1,0,363272,7,,S
894,2,"Myles, Mr. Thomas Francis",male,62,0,0,240276,9.6875,,Q
895,3,"Wirz, Mr. Albert",male,27,0,0,315154,8.6625,,S
896,3,"Hirvonen, Mrs. Alexander (Helga E Lindqvist)",female,22,1,1,3101298,12.2875,,S
897,3,"Svensson, Mr. Johan Cervin",male,14,0,0,7538,9.225,,S

你可以在这里阅读更多关于熊猫的文章http://pandas.pydata.org/pandas-docs/stable/tutorials.html

我假设你用的是熊猫,因为问题的标签是熊猫。按如下方式阅读文件:

df = pd.read_csv('test.txt', skiprows=0, index_col=0, 
            names='city_type name sex weight has_cat has_dog bank_balance body_fat_index car_mileage car_type'.split())

您将得到这样一个数据帧: enter image description here

我冒昧为专栏编了名字。在

一旦你把数据读入一个数据框,你就可以用它做各种各样的魔术——看看熊猫教程(它们很棒)。这里有一个例子

^{pr2}$

相关问题 更多 >