在学习大熊猫的过程中,我试图解决这个问题的答案已有好几个月了.我使用SAS进行日常工作,这非常适合它的核心支持.然而,由于其他许多原因,SAS作为一款软件非常糟糕.
有一天,我希望用python和pandas替换我对SAS的使用,但我目前缺乏大型数据集的核心工作流程.我不是在谈论需要分布式网络的"大数据",而是说文件太大而无法容纳在内存中,但又足够小以适应硬盘驱动器.
我的第一个想法是用于HDFStore在磁盘上保存大型数据集,并仅将我需要的部分拉入数据帧进行分析.其他人提到MongoDB是一种更容易使用的替代品.我的问题是:
有哪些最佳实践工作流程可用于完成以下任务:
真实世界的例子将非常受欢迎,尤其是那些在"大数据"上使用熊猫的人.
编辑 - 我希望如何工作的示例:
我正在尝试找到执行这些步骤的最佳实践方法.阅读关于pandas和pytables的链接似乎附加一个新列可能是个问题.
编辑 - 特别回应杰夫的问题:
if var1 > 2 then newvar = 'A' elif var2 = 4 then newvar = 'B'.这些操作的结果是我的数据集中每条记录的新列.我很少会在数据集中添加行.我几乎总是会创建新的列(统计/机器学习用语中的变量或特征).
我正在探索作为长期SAS用户切换到python和pandas.
但是,今天运行一些测试时,我很惊讶python在尝试pandas.read_csv()128mb csv文件时内存不足.它有大约200,000行和200列主要是数字数据.
使用SAS,我可以将csv文件导入SAS数据集,它可以和我的硬盘一样大.
有类似的东西pandas吗?
我经常处理大型文件,无法访问分布式计算网络.
我无法弄清楚如何跳过csv文件中的n行,但保留标题为1行.
我想要做的是迭代,但保持第一行的标题. skiprows使标题成为跳过行之后的第一行.这样做的最佳方式是什么?
data = pd.read_csv('test.csv', sep='|', header=0, skiprows=10, nrows=10)
Run Code Online (Sandbox Code Playgroud) 我已将程序(如下)写入:
pandas dataframegroupby使用特定列值拆分数据并存储为数据帧列表.multiprocess Pool.map()并行处理每个数据帧.一切都很好,该程序在我的小测试数据集上运行良好.但是,当我输入大数据(大约14 GB)时,内存消耗呈指数级增长,然后冻结计算机或被杀死(在HPC群集中).
一旦数据/变量无效,我就添加了代码来清除内存.一旦完成,我也正在关闭游泳池.仍然有14 GB的输入我只期望2*14 GB的内存负担,但似乎很多正在进行.我也尝试使用调整,chunkSize and maxTaskPerChild, etc但我没有看到测试与大文件的优化有任何区别.
我认为,当我开始时,在此代码位置需要对此代码进行改进multiprocessing.
p = Pool(3) # number of pool to run at once; default at 1
result = p.map(matrix_to_vcf, list(gen_matrix_df_list.values()))
但是,我发布了整个代码.
测试示例:我创建了一个高达250 mb的测试文件("genome_matrix_final-chr1234-1mb.txt")并运行该程序.当我检查系统监视器时,我可以看到内存消耗增加了大约6 GB.我不太清楚为什么250 mb文件加上一些输出需要这么大的内存空间.如果它有助于查看真正的问题,我通过下拉框共享该文件.https://www.dropbox.com/sh/coihujii38t5prd/AABDXv8ACGIYczeMtzKBo0eea?dl=0
有人可以建议,我怎么能摆脱这个问题?
我的python脚本:
#!/home/bin/python3
import pandas as pd
import collections
from multiprocessing import Pool
import io
import time
import resource
print()
print('Checking required modules')
print()
''' change this input file name and/or …Run Code Online (Sandbox Code Playgroud) 在一个基础我有下一个过程.
import csv
reader = csv.reader(open('huge_file.csv', 'rb'))
for line in reader:
process_line(line)
Run Code Online (Sandbox Code Playgroud)
看到这个相关的问题.我想每100行发送一次生产线,以实现批量分片.
实现相关答案的问题是csv对象是不可取消的,不能使用len.
>>> import csv
>>> reader = csv.reader(open('dataimport/tests/financial_sample.csv', 'rb'))
>>> len(reader)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: object of type '_csv.reader' has no len()
>>> reader[10:]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: '_csv.reader' object is unsubscriptable
>>> reader[10]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: '_csv.reader' object is …Run Code Online (Sandbox Code Playgroud) 我感到困惑的区别是什么之间client.persist()和client.compute()双方似乎(在某些情况下),开始我的计算,都返回异步对象,但不是在我的简单的例子:
在这个例子中
from dask.distributed import Client
from dask import delayed
client = Client()
def f(*args):
return args
result = [delayed(f(x)) for x in range(1000)]
x1 = client.compute(result)
x2 = client.persist(result)
Run Code Online (Sandbox Code Playgroud)
这里x1和x2它们不同,但是在一个不那么简单的计算中,result也是一个Delayed对象列表,使用client.persist(result)开始计算就像client.compute(result)那样.
我一直试图用Pandas读取一些大文本文件(大小约为1.4GB - 2GB),使用该read_csv功能,但没有用.以下是我使用的版本:
我尝试了以下方法:
df = pd.read_csv(data.txt')
Run Code Online (Sandbox Code Playgroud)
它用一条消息撞毁了Ipython : Kernel died, restarting.
然后我尝试使用迭代器:
tp = pd.read_csv('data.txt', iterator = True, chunksize=1000)
Run Code Online (Sandbox Code Playgroud)
再次,我得到了Kernel died, restarting错误.
有任何想法吗?或者以其他方式阅读大文本文件?
谢谢!
所以.我们有一个混乱的数据存储在我需要分析的TSV文件中.这是它的外观
status=200 protocol=http region_name=Podolsk datetime=2016-03-10 15:51:58 user_ip=0.120.81.243 user_agent=Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36 user_id=7885299833141807155 user_vhost=tindex.ru method=GET page=/search/
Run Code Online (Sandbox Code Playgroud)
问题是一些行具有不同的列顺序/其中一些缺少值,我需要摆脱高性能(因为我正在使用的数据集高达100千兆字节).
Data = pd.read_table('data/data.tsv', sep='\t+',header=None,names=['status', 'protocol',\
'region_name', 'datetime',\
'user_ip', 'user_agent',\
'user_id', 'user_vhost',\
'method', 'page'], engine='python')
Clean_Data = (Data.dropna()).reset_index(drop=True)
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,一些列是偏移的.我做了一个非常低性能的解决方案
ids = Clean_Data.index.tolist()
for column in Clean_Data.columns:
for row, i in zip(Clean_Data[column], ids):
if np.logical_not(str(column) in row):
Clean_Data.drop([i], inplace=True)
ids.remove(i)
Run Code Online (Sandbox Code Playgroud)
所以现在数据看起来不错......至少我可以使用它! 但是我上面提到的方法的高性能替代方案是什么?
更新unutbu代码:traceback错误
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-4-52c9d76f9744> in <module>() …Run Code Online (Sandbox Code Playgroud) 最近我偶然发现了http://dask.pydata.org/en/latest/ 因为我有一些只能在单核上运行的 Pandas 代码,我想知道如何利用我的其他 CPU 核。dask 可以很好地使用所有(本地)CPU 内核吗?如果是,它与熊猫的兼容性如何?
我可以对 Pandas 使用多个 CPU 吗?到目前为止,我阅读了有关发布 GIL 的信息,但这一切似乎都相当复杂。
我正在尝试使用 pandas 将一个大的 tab/txt(大小 = 3 gb)文件导入 Python pd.read_csv("file.txt",sep="\t")。我加载的文件是一个“.tab”文件,我将其扩展名更改为“.txt”以将其导入read_csv()。它是一个包含 305 列和 +/- 1 000 000 行的文件。
当我执行代码时,一段时间后 Python 返回一个 MemoryError。我搜索了一些信息,这基本上意味着没有足够的可用 RAM。当我指定nrows = 20的read_csv()它工作正常。
我使用的计算机有 46gb 的 RAM,其中大约 20gb 可用于 Python。
我的问题:3gb 的文件怎么可能需要超过 20gb 的 RAM 才能使用 pandas 导入 Python read_csv()?我做错了什么吗?
编辑:在执行df.dtypes该类型的混合object,float64以及int64
更新:我使用以下代码来解决这个问题并执行我的计算:
summed_cols=pd.DataFrame(columns=["sample","read sum"])
while x<352:
x=x+1
sample_col=pd.read_csv("file.txt",sep="\t",usecols=[x])
summed_cols=summed_cols.append(pd.DataFrame({"sample":[sample_col.columns[0]],"read sum":sum(sample_col[sample_col.columns[0]])}))
del sample_col
Run Code Online (Sandbox Code Playgroud)
它现在选择一列,执行计算,将结果存储在数据框中,删除当前列,然后移动到下一列