Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 基于特定标准从文本文件创建数据框架_Python 3.x_Pandas_Performance_Dataframe - Fatal编程技术网

Python 3.x 基于特定标准从文本文件创建数据框架

Python 3.x 基于特定标准从文本文件创建数据框架,python-3.x,pandas,performance,dataframe,Python 3.x,Pandas,Performance,Dataframe,我有一个大约3.3GB的文本文件。我只对这个文本文件中的两列感兴趣(共47列)。从这两列中,我只需要col2=='text1'的行。例如,考虑我的文本文件的值,如: 文本文件: col1~col2~~~~~~~~~~~~ 12345~text1~~~~~~~~~~~~ 12365~text1~~~~~~~~~~~~ 25674~text2~~~~~~~~~~~~ 35458~text3~~~~~~~~~~~~ 44985~text4~~~~~~~~~~~~ 我想创建一个df,其中col2=='

我有一个大约3.3GB的文本文件。我只对这个文本文件中的两列感兴趣(共47列)。从这两列中,我只需要
col2=='text1'
的行。例如,考虑我的文本文件的值,如:

文本文件:

col1~col2~~~~~~~~~~~~
12345~text1~~~~~~~~~~~~
12365~text1~~~~~~~~~~~~
25674~text2~~~~~~~~~~~~
35458~text3~~~~~~~~~~~~
44985~text4~~~~~~~~~~~~
我想创建一个
df
,其中
col2=='text1'
。到目前为止,我所做的是尝试将整个文本文件加载到我的
df
中,然后过滤掉所需的行。但是,由于这是一个大型文本文件,因此创建
df
需要45分钟以上。我相信只加载必要的行(如果可能的话)是理想的,因为
df
的大小要小得多,而且我不会遇到内存问题

我的代码:

df=pd.read\u csv('myfile.txt',低内存=False,sep='~',usecols=['col1','col2'],dtype={'col2':str})
df1=df[df['col2']=='text1']

简而言之,在将文本文件加载到dataframe时,我是否可以根据条件筛选列,以便1)减少加载时间,2)减少内存中
df
的大小

好吧,我想出了一个解决办法。基本上,它必须以块的形式加载数据,并为
col2==“text1”
过滤块。这样,我每次只在内存中加载一个块,而我的最终
df
将只包含我需要的数据

代码:

final=pd.DataFrame()
df=pd.read\u csv('myfile.txt',内存不足=False,sep='~',usecols=['col1','col2'],dtype={'col2':str},chunksize=100000)
对于df中的块:
a=chunk[chunk['col2']=='text1']
最终=局部固结([最终,a],轴=0)

最好的选择,如果有的话,将是最受欢迎的

为什么
sep='~'
?我在中没有看到
~
sample@harvpan我的文本文件是~分隔的。我没有提到,会编辑的!您可以通过cut和grep在unix中进行进一步处理,并使用子流程模块将数据拉回到pandas/python中。我没有一个样本文件,但工作;这只是一个建议。这篇文章应该解释更多:@sammywemmy我在一台windows机器上工作,但我相信chunksize也做同样的事情。它将文件分为多个块,并允许您一次处理一个块。因此,我们只将一个块加载到内存中,而不是整个文件。