在python中读取包含多个未标记变量(按列分类)的大输入文件的智能方法
我有下面的代码,运行了超过一百万行。但这需要很多时间。有没有更好的方法读取这些文件?当前代码如下所示:在python中读取包含多个未标记变量(按列分类)的大输入文件的智能方法,python,file-io,large-files,Python,File Io,Large Files,我有下面的代码,运行了超过一百万行。但这需要很多时间。有没有更好的方法读取这些文件?当前代码如下所示: for line in lines: line = line.strip() #Strips extra characters from lines columns = line.split() #Splits lines into individual 'strings' x = columns[0]
for line in lines:
line = line.strip() #Strips extra characters from lines
columns = line.split() #Splits lines into individual 'strings'
x = columns[0] #Reads in x position
x = float(x) #Converts the strings to float
y = columns[1] #Reads in y
y = float(y) #Converts the strings to float
z = columns[2] #Reads in z
z = float(z) #Converts the strings to float
347.528218024 354.824474847 223.554247185 -47.3141937738 -18.7595743981
317.843928028 652.710791858 795.452586986 -177.876355361 7.77755408015
789.419369714 557.566066378 338.090799912 -238.803813301 -209.784710166
449.259334688 639.283337249 304.600907059 26.9716202117 -167.461497735
739.302109761 532.139588049 635.08307865 -24.5716064556 -91.5271790951
文件数据如下所示:
for line in lines:
line = line.strip() #Strips extra characters from lines
columns = line.split() #Splits lines into individual 'strings'
x = columns[0] #Reads in x position
x = float(x) #Converts the strings to float
y = columns[1] #Reads in y
y = float(y) #Converts the strings to float
z = columns[2] #Reads in z
z = float(z) #Converts the strings to float
347.528218024 354.824474847 223.554247185 -47.3141937738 -18.7595743981
317.843928028 652.710791858 795.452586986 -177.876355361 7.77755408015
789.419369714 557.566066378 338.090799912 -238.803813301 -209.784710166
449.259334688 639.283337249 304.600907059 26.9716202117 -167.461497735
739.302109761 532.139588049 635.08307865 -24.5716064556 -91.5271790951
我想从不同的列中提取每个数字。列中的每个元素都是相同的变量。我该怎么做?例如,我想要一个列表,比如说l,来存储第一列的浮动。了解您打算对数据做什么会很有帮助,但您可以尝试:
data = [map(float, line.split()) for line in lines]
这将为您提供一个包含数据的列表。了解您计划如何处理数据会有所帮助,但您可以尝试:
data = [map(float, line.split()) for line in lines]
这将为您提供一个包含您的数据的列表。是为此而构建的(除其他外)
它使用numpy,在引擎盖下使用C,速度非常快。(实际上,根据您对数据的处理情况,您可能希望直接使用numpy而不是熊猫。但是,我只会在您尝试熊猫后才这样做;numpy级别较低,熊猫会让您的生活更轻松。)
以下是您读取数据的方法:
import pandas as pd
with open('testfile', 'r') as f:
d = pd.read_csv(f, delim_whitespace=True, header=None,
names=['delete me','col1','col2','col3','col4','col5'])
d = d.drop('delete me',1) # the first column is all spaces and gets interpreted
# as an empty column, so delete it
print d
这将产生:
col1 col2 col3 col4 col5
0 347.528218 354.824475 223.554247 -47.314194 -18.759574
1 317.843928 652.710792 795.452587 -177.876355 7.777554
2 789.419370 557.566066 338.090800 -238.803813 -209.784710
3 449.259335 639.283337 304.600907 26.971620 -167.461498
4 739.302110 532.139588 635.083079 -24.571606 -91.527179
在本例中,d
的结果是一个强大的数据结构,称为a,它为您提供了许多快速操作数据的选项
作为一个简单的示例,这将添加前两列并获得结果的平均值:
(d['col1'] + d['col2']).mean() # 1075.97544372
熊猫也很好地处理丢失的数据;如果数据文件中存在缺失/错误值,pandas在读入这些值时会根据需要将其替换为NaN
或None
无论如何,为了快速、方便地进行数据分析,我强烈推荐这个库。就是为此而构建的(还有许多其他东西)
它使用numpy,在引擎盖下使用C,速度非常快。(实际上,根据您对数据的处理情况,您可能希望直接使用numpy而不是熊猫。但是,我只会在您尝试熊猫后才这样做;numpy级别较低,熊猫会让您的生活更轻松。)
以下是您读取数据的方法:
import pandas as pd
with open('testfile', 'r') as f:
d = pd.read_csv(f, delim_whitespace=True, header=None,
names=['delete me','col1','col2','col3','col4','col5'])
d = d.drop('delete me',1) # the first column is all spaces and gets interpreted
# as an empty column, so delete it
print d
这将产生:
col1 col2 col3 col4 col5
0 347.528218 354.824475 223.554247 -47.314194 -18.759574
1 317.843928 652.710792 795.452587 -177.876355 7.777554
2 789.419370 557.566066 338.090800 -238.803813 -209.784710
3 449.259335 639.283337 304.600907 26.971620 -167.461498
4 739.302110 532.139588 635.083079 -24.571606 -91.527179
在本例中,d
的结果是一个强大的数据结构,称为a,它为您提供了许多快速操作数据的选项
作为一个简单的示例,这将添加前两列并获得结果的平均值:
(d['col1'] + d['col2']).mean() # 1075.97544372
熊猫也很好地处理丢失的数据;如果数据文件中存在缺失/错误值,pandas在读入这些值时会根据需要将其替换为NaN
或None
无论如何,为了快速、简单的数据分析,我强烈推荐这个库。也会稍微快一点,作为列表理解。不需要
.strip()
--.split()
会自动在末尾删除空白。我想从不同的列中提取每个数字。列中的每个元素都是相同的变量。我该怎么做?例如,我想要一个列表,l,用来存储第一列的浮点值。[j[0]表示数据中的j]
提取第一列<如果你需要做大量的操作,那么code>pandas或numpy
/scipy
可能是一个更好的主意。对于numpy,您可以numpy.array(data)[:,0]
来获取第一列。作为列表理解,也会稍微快一点。无需.strip()
--.split()
将自动在末尾删除空格。我想从不同的列中提取每个数字。列中的每个元素都是相同的变量。我该怎么做?例如,我想要一个列表,l,用来存储第一列的浮点值。[j[0]表示数据中的j]
提取第一列<如果你需要做大量的操作,那么code>pandas或numpy
/scipy
可能是一个更好的主意。对于numpy,您可以numpy.array(data)[:,0]
获取第一列。我想从不同的列中提取每个数字。列中的每个元素都是相同的变量。我该怎么做?例如,我想要一个列表,l,用来存储第一列的浮动。我不确定我是否理解这个问题。。。?您当然可以将内容发送到列表,但将所有内容保存在数据结构(数据帧和系列)中要快得多,也容易得多。d['col1']
本质上是第一列中所有值的列表。这只是一个超级快速的列表,有额外的方法来计算。谢谢,我现在明白你说的了。我想从不同的列中提取每个数字。列中的每个元素都是相同的变量。我该怎么做?例如,我想要一个列表,l,用来存储第一列的浮动。我不确定我是否理解这个问题。。。?您当然可以将内容发送到列表,但将所有内容保存在数据结构(数据帧和系列)中要快得多,也容易得多。d['col1']
本质上是第一列中所有值的列表。这只是一个超级快速的列表,上面有额外的计算方法。谢谢,我现在明白你说的了。