【问题标题】:How to read a CSV without the first column如何在没有第一列的情况下读取 CSV
【发布时间】:2013-10-09 05:38:30
【问题描述】:

我正在尝试读取如下所示的简单 CSV 文件,并将其内容放入二维数组中:

"","x","y","sim1","sim2","sim3","sim4","sim5","sim6","sim7","sim8","sim9","sim10","sim11","sim12"
"1",181180,333740,5.56588745117188,6.29487752914429,7.4835410118103,5.75873327255249,6.62183284759521,5.81478500366211,4.85671949386597,5.90418815612793,6.32611751556396,6.99649047851562,6.52076387405396,5.68944215774536
"2",181140,333700,6.36264753341675,6.5217604637146,6.16843748092651,5.55328798294067,7.00429201126099,6.43625402450562,6.17744159698486,6.72836923599243,6.38574266433716,6.81451606750488,6.68060827255249,6.14339065551758
"3",181180,333700,6.16541910171509,6.44704437255859,7.51744651794434,5.46270132064819,6.8890323638916,6.46842670440674,6.07698059082031,6.2140531539917,6.43774271011353,6.21923875808716,6.43355655670166,5.90692138671875

为此,我使用这个:

data = np.loadtxt("Data/sim.csv", delimiter=',', skiprows=1)

但我总是收到这样的信息:

"ValueError: could not convert string to float: "1"

我认为问题出在每一行的第一列。所以,我试图在没有第一列的情况下阅读它,但我不知道如何。

那么,我怎么能忽略第一列呢?有没有办法用第一列读取这个文件?

【问题讨论】:

  • 您可以使用usecols指定要读取的列。

标签: python csv numpy


【解决方案1】:

您可以为任何列指定转换器。

converters = {0: lambda s: float(s.strip('"')}
data = np.loadtxt("Data/sim.csv", delimiter=',', skiprows=1, converters=converters)

或者,您可以指定要使用的列,例如:

data = np.loadtxt("Data/sim.csv", delimiter=',', skiprows=1, usecols=range(1,15))

http://docs.scipy.org/doc/numpy/reference/generated/numpy.loadtxt.html


在不知道列数的情况下跳过第一列的一种方法是手动从 csv 中读取列数。这很容易,尽管您有时可能需要对此进行调整以解决格式不一致*。

with open("Data/sim.csv") as f:
    ncols = len(f.readline().split(','))

data = np.loadtxt("Data/sim.csv", delimiter=',', skiprows=1, usecols=range(1,ncols+1))

*如果顶部有空行,您需要跳过它们。如果字段标题中可能有逗号,则应改为使用第一个数据行来计算列。因此,如果您有具体问题,我可以添加一些细节以使代码更加健壮。

【讨论】:

  • 我自己编写了 converters 方法,但 OP 不需要像 float(s.strip('"')) 这样的东西吗?
  • 是的,我想到了第二种解决方案。但不一定我会知道 cols 范围。有一种说法是“使用除第一列之外的每一列”?
  • 如果有dontusecols,或者usecols 可以接受一个切片对象而不是一个可迭代对象,那就太好了(所以你可以只使用usecols=slice(1, None),也可以使用@987654330 之类的东西@ 跳过最后一行等)。
  • @abarnert 同意。或者,如果您可以为每一列设置默认转换器以提供nan 而不是引发错误。
【解决方案2】:

您可以使用 pandas 并将其作为 DataFrame 对象读取。如果您知道不需要的列,只需在加载行中添加.drop

a = pandas.read_csv("Data/sim.csv",sep=",")
a = a.drop(a.columns[0], axis=1)

第一行将作为标题读取,但您可以在 read_csv 参数中添加 skiprows=1。 Pandas DataFrame 是 numpy 数组,因此,将列或矩阵转换为 numpy 数组非常简单。

【讨论】:

  • 第一次阅读时不能使用drop part。上述方法仅在您已经读取变量“a”中的 csv 文件时才有效。
【解决方案3】:

jmilloy 和 Deninhos 的回答都很好。如果 OP 特别想读入 NumPy 数组(与 pandas 数据帧相反),另一种简单的选择是在读入索引列后删除它。当您知道索引列始终是第一个但特征数(列)是灵活的。

data = np.loadtxt("Data/sim.csv", delimiter=',', skiprows=1)
data = np.delete(data, 0, axis = 1)

【讨论】:

    【解决方案4】:
    with open(filename, 'r') as csvfile:
        csvreader = csv.reader(csvfile, delimiter=',', quotechar='|')
        for row in csvreader:
            data.append(float(row[1]))
    

    【讨论】:

      【解决方案5】:
      import pandas
      
      pandas_data = pandas.read_csv('filename', sep=",", header=0,index_col=0) 
      

      【讨论】:

        【解决方案6】:

        尝试使用 csv 库读取 csv 文件

        import csv
        
        def someFunc(fname):
            with open(fname) as f:
            reader = csv.reader(f)
        
            i = 0
            header = True
            for row in reader:
                if header:
                    header = False
                    continue
        
                out[i] = [row[j] for j in range(len(columns))]
                i += 1
        return out
        

        out 会有二维数组。

        【讨论】:

        • OP 想要构建一个 numpy 数组,而不是列表列表。 (并且构建一个列表列表只是为了构建一个 numpy 数组会稍微慢一些并且使用更多的内存......这是人们首先使用 numpy 的主要原因之一。)
        【解决方案7】:

        这对我有用

        import pandas
        data = pandas.read_csv("Data/sim.csv",sep=",").iloc[:,1:]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-11-07
          • 2013-07-30
          • 2020-01-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-04-05
          相关资源
          最近更新 更多