【问题标题】:How to read csv如何读取 csv
【发布时间】:2015-07-21 09:57:43
【问题描述】:

我有一个数据存储在 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

每个

的数据类型
1. int        6. int
2. int        7. int
3. String     8. float
4. String     9. float
5. float      10.String
              11.String

892, 893, ... 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,第三列就有问题,因为它在双引号内包含逗号。

我希望用自己的数据类型存储每一列,即第一列应该存储为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文件?

【问题讨论】:

  • pandas.read_csv('data.csv', dtypes=[int, int, str]) 呢?
  • @mbatchkarov 我不知道 pandas,我可以用它在 arraymatrix 中得到预期的结果吗?你能用你的方式写一个答案吗?
  • @mbatchkarov 嘿,我应该如何使用它?第一行是标题

标签: python numpy pandas anaconda


【解决方案1】:

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

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

输出:

[[892, 3, 'Kelly, Mr. James', 'male', 34.5, 0, 0, 330911.0, 7.8292, nan, 'Q'],
 [893, 3, 'Wilkes, Mrs. James (Ellen Needs)', 'female', 47.0, 1, 0, 363272.0, 7.0, nan, 'S'],
 [894, 2, 'Myles, Mr. Thomas Francis', 'male', 62.0, 0, 0, 240276.0, 9.6875, nan, 'Q'],
 [895, 3, 'Wirz, Mr. Albert', 'male', 27.0, 0, 0, 315154.0, 8.6625, nan, 'S'],
 [896, 3, 'Hirvonen, Mrs. Alexander (Helga E Lindqvist)', 'female', 22.0, 1, 1, 3101298.0, 12.2875, nan, 'S'],
 [897, 3, 'Svensson, Mr. Johan Cervin', 'male', 14.0, 0, 0, 7538.0, 9.225, nan, 'S']]

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阅读更多关于熊猫的信息

【讨论】:

  • 如何使用熊猫数据框达到第一个元素,即 892?我做了 df[0:0] 或 df[0][0] 但给出了错误。
  • print df.ix[0, 'col1'] 其中 0 是索引,col1 是列名,或 print df['col1'].values[0] @carenvanderlee
  • 非常感谢。我有点困惑。如果第 0 个元素是数据,即 892,我如何从 df 获取标题
  • print pd.DataFrame(df).columns,会给你列@carenvanderlee
【解决方案2】:

我不确定我是否完全理解你,但我认为这对你有用。

我实现了另外两个函数来决定字符串是浮点数还是整数。

如果字符串是空字符串,我写了None,不过,你可以把它改成你喜欢的。

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

输出:

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

【讨论】:

  • @carenvanderlee ,我的回答没有满足您的问题?
  • 你说“我不确定我是否完全理解你,但我认为这对你有用。”
  • 它似乎工作,但它是太多的编码。我正在寻找轻量级的解决方案。此外,所有列类型在编译时都是已知的,即在您的代码中,我的意思是过多的 if-else 检查。
【解决方案3】:

我假设您使用的是 pandas,因为问题被标记为 pandas。像这样读取文件:

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

你会得到一个这样的数据框:

我冒昧地为列编了名字。

一旦您将数据读入数据框,您就可以用它做各种魔法——看看 pandas 教程(它们很棒)。这是一个例子

df.bank_balance.describe()

count          6.000000
mean      726408.166667
std      1170522.652019
min         7538.000000
25%       258995.500000
50%       323032.500000
75%       355181.750000
max      3101298.000000
Name: bank_balance, dtype: float64

【讨论】:

    猜你喜欢
    • 2012-10-14
    • 2019-07-16
    • 2020-06-22
    • 2019-03-22
    • 2021-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多