Python:对100,000行×40列CSV文件的分析
我有大约100个CSV文件,每个文件有10万行和40列数据。我想对这些数据进行一些统计分析,比如提取一些样本数据,绘制一般趋势图,做方差和R平方分析,还想绘制一些光谱图。目前,我在考虑使用numpy来进行分析。
我想知道处理这么大的文件时会遇到什么问题?我已经检查过数据有没有错误。你有什么建议来进行统计分析吗?要是我把文件分开,然后在Excel里做会不会更好?
5 个回答
1
Python在处理这类数据时非常好用,特别是当你的数据是“行”的时候,你可以独立处理每一行:
row1
row2
row3
etc.
实际上,由于使用了生成器和生成器表达式,你的程序可以占用非常少的内存。你可以在这里了解更多关于生成器的内容:http://www.dabeaz.com/generators/(这不是基础知识,但有一些让人脑洞大开的生成器应用)。
关于S.Lott的回答,你可能想避免对行序列使用filter(),因为如果你传入一个足够长的序列,可能会让你的电脑崩溃(试试:filter(None, itertools.count())
- 在保存好你所有数据后 :-))。用下面这种方式替代filter
会更好:
def filter_generator(func, sequence):
for item in sequence:
if (func is None and item) or func(item):
yield item
或者更简短一些:
filtered_sequence = (item for item in sequence if (func is None and item) or func(item))
这可以通过在循环之前提取条件来进一步优化,不过这是留给读者的练习 :-)
13
我发现用Python配合CSV文件处理数据,可能是最快、最简单的方法之一,特别是做一些统计分析的时候。
我们经常需要重新整理数据或者修正一些奇怪的错误,这时候Python就派上用场了。
Python提供了一些函数式编程的功能,这让事情变得特别简单。你可以用这样的工具来进行抽样。
def someStatFunction( source ):
for row in source:
...some processing...
def someFilterFunction( source ):
for row in source:
if someFunction( row ):
yield row
# All rows
with open( "someFile", "rb" ) as source:
rdr = csv.reader( source )
someStatFunction( rdr )
# Filtered by someFilterFunction applied to each row
with open( "someFile", "rb" ) as source:
rdr = csv.reader( source )
someStatFunction( someFilterFunction( rdr ) )
我非常喜欢把简单的函数组合成更复杂的函数,这样可以更方便地处理问题。