2017-06-12 151 views
1

上一篇文章的延续。以前,我曾帮助使用Pandas在数据框中创建新列,并且每个值都会根据另一列的值表示分解值或唯一值。我在一个测试用例上使用了它,并且它可以成功运行,但是我有一个更大的日志和htm文件来执行相同的过程。我有12个日志文件(每个月),并将它们合并后,我得到一个17Gb文件。我想分解每个用户名。我一直在研究使用Dask,但是,我无法复制排序的功能并将因数分解为我想要的Dask数据帧。尝试使用Dask,继续使用熊猫还是尝试使用MySQL数据库来操作17GB文件会更好吗?熊猫大CSV

import pandas as pd 
import numpy as np 
#import dask.dataframe as pf 
df = pd.read_csv('example2.csv', header=0, dtype='unicode') 
df_count = df['fruit'].value_counts() 
df.sort_values(['fruit'], ascending=True, inplace=True) 
sorting the column fruit  
df.reset_index(drop=True, inplace=True) 
f, u = pd.factorize(df.fruit.values) 
n = np.core.defchararray.add('Fruit', f.astype(str)) 
df = df.assign(NewCol=n) 
#print(df) 
df.to_csv('output.csv') 
+0

你可能要考虑PySpark:http://spark.apache.org/docs/2.1.0/api/python/pyspark.html – Tim

+0

是否有可能启动与熊猫或Dask一起出去,只是在Dask输出使用熊猫的功能? –

回答

1

它会更好尝试使用DASK,继续与熊猫或与MySQL数据库来处理一个17GB文件试试?

这个问题的答案取决于很多事情,可能过于笼统,无法在Stack Overflow上得到很好的答案。

不过,也有您带来了更易于回答

几个具体问题如何因式分解列?

这里最简单的方法就是分类列:

df = df.categorize(columns=['fruit']) 

如何做一个列

您可以始终将列在索引中我有点独特的价值观,这将导致一种排序。但是请注意,在分布式设置中排序可能会非常昂贵。

但是,如果您想要使用少量选项对列进行排序,那么您可能会找到唯一值,对这些内存进行排序,然后将这些值加回到数据帧中。像下面的内容可能会奏效:

unique_fruit = df.fruit.drop_duplicates().compute() # this is now a pandas series 
unique_fruit = unique_fruit.sort_values() 
numbers = pd.Series(unique_fruit.index, index=unique_fruit.values, name='fruit') 

df = df.merge(numbers.to_frame(), left_on='fruit', right_index=True)