上一篇文章的续篇。以前,我帮助使用Pandas在数据框架中创建新列,并且每个值将表示基于另一列值的因子化或唯一值。我在测试用例中使用了它并且它成功运行,但是我遇到了一个更大的日志和htm文件来执行相同的过程。我有12个日志文件(每个月),在组合后,我得到一个17Gb文件。我想分析它上面的每个用户名。我一直在研究使用Dask,但是,我无法复制sort和factorize的功能来为Dask数据帧做我想做的事情。尝试使用Dask,继续使用Pandas还是尝试使用MySQL数据库来操作17GB文件会更好吗?
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 :(得分:1)
尝试使用Dask,继续使用Pandas或尝试使用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)