【问题标题】:How to convert the second column of a csv file to a list of floats?如何将 csv 文件的第二列转换为浮点数列表?
【发布时间】:2015-05-23 02:15:24
【问题描述】:

我有这样的 csv 文件:

string, 3.54545,4.3434,3.34435543
string, 4.54545,67.3434,5.34435543
...
stringN, 5.54545,1.3434,9.34435543

如何使用 csv 模块提取两个不同列表中的第一列(字符串)和第二列(浮点数)?例如,我想得到这样的东西:

list1 = [string,string,...,string]
list2 = [3.54545,4.54545,..,5.54545]

其中list1 是字符串列表,list2 是浮点数列表。我用 pandas 尝试了以下操作,问题是它需要大量读取文件:

df = pd.read_csv('test_dict.csv', header = None)

list1 = df[0].values.tolist()
list2 = df[1].values.tolist()

提前谢谢各位!

【问题讨论】:

  • 问题是它需要大量读取文件:你是什么意思?
  • 感谢@TimCastelijns 的反馈。问题在于,对于 pandas,这项任务花费了很多时间。另一种方法呢(例如使用 numpy 阅读器或使用 csv 模块)?
  • Pandas 是针对此类任务的优化库,您为什么认为使用例如手动执行它? csv 模块会更快吗?
  • 你的文件有多大?
  • 这很令人惊讶,因为我希望 pandas 在眨眼间就能读完三千行。也许您代码的其他部分是导致速度变慢的原因。

标签: python python-2.7 csv numpy pandas


【解决方案1】:

如果你想要前两列,你可以压缩:

import  csv

with open("in.csv") as f:
    reader = csv.reader(f)
    zipped = zip(*reader)
    s, f = list(next(zipped)), list(map(float, next(zipped)))

对于 python 2 使用 itertools.izip:

import  csv
from itertools import  izip

with open("in.csv") as f:
    reader = csv.reader(f)
    zipped = izip(*reader)
    s, f = list(next(zipped)), map(float, next(zipped))
    print(s, f)
 (['string', 'string', 'stringN'], [3.54545, 4.54545, 5.54545])

【讨论】:

  • 感谢您的反馈。我得到了以下异常:File "test.py", line 7, in <module> s, f = list(next(zipped)), map(float,next(zipped)) ValueError: could not convert string to float:
  • 您是否有标题,您的数据是否与您提供的完全一致?尝试删除地图浮动,看看您是否看到任何会导致错误的值
  • 我的数据中没有任何标题。数据与上述示例中提供的数据完全相同。感谢您的支持!
  • 我已经用 3000 行类似的数据对其进行了测试,并且没有出现错误,请尝试删除 map 调用,看看您是否看到任何奇怪的输出
  • 我的意思是保留next(zipped) ,next(zipped) 不完全删除!只是尝试不要投射到浮动
【解决方案2】:

你可以像这样使用 csv 模块来做到这一点,但正如我在我的 cmets 中所说,不要指望它比使用 pandas 更快。

import csv

col1 = []
col2 = []

with open('test_dict.csv') as f:
  for row in csv.reader(f):
    col1.append(row[0])
    col2.append(row[1])

【讨论】:

  • col2 是浮点数还是字符串列表?感谢您的帮助
  • col1 是字符串列表,col2 是浮点数列表
  • 谢谢,但我猜col2 是一个字符串列表,如何将其转换为浮点数列表?我希望将它乘以另一个列表,这就是为什么我想将它作为一个列表来获取。
  • @newWithPython, float(row[1])
猜你喜欢
  • 2017-03-29
  • 1970-01-01
  • 1970-01-01
  • 2018-07-10
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 2016-07-11
相关资源
最近更新 更多