我有一个csv大文件,我无法在内存中使用python处理.在使用以下逻辑对特定列的值进行分组后,我将其拆分为多个块:
def splitDataFile(self, data_file):
self.list_of_chunk_names = []
csv_reader = csv.reader(open(data_file, "rb"), delimiter="|")
columns = csv_reader.next()
for key,rows in groupby(csv_reader, lambda row: (row[1])):
file_name = "data_chunk"+str(key)+".csv"
self.list_of_chunk_names.append(file_name)
with open(file_name, "w") as output:
output.write("|".join(columns)+"\n")
for row in rows:
output.write("|".join(row)+"\n")
print "message: list of chunks ", self.list_of_chunk_names
return
Run Code Online (Sandbox Code Playgroud)
逻辑正在运行,但速度很慢.我想知道如何优化这个?比如熊猫?
编辑
进一步的解释:我不是在寻找一个简单的分割到相同大小的块(比如每个有1000行),我想用列的值进行拆分,这就是我使用groupby的原因.
我将采用如下所示的方法,其中我将迭代要分割的列的唯一值,以过滤数据块。
def splitWithPandas(data_file, split_by_column):
values_to_split_by = pd.read_csv(data_file, delimiter="|", usecols=[split_by_column])
values_to_split_by.drop_duplicates()
values_to_split_by = pd.unique(values_to_split_by.values.ravel())
for i in values_to_split_by:
iter_csv = pd.read_csv(data_file, delimiter="|", chunksize=100000)
df = pd.concat([chunk[chunk[split_by_column] == i] for chunk in iter_csv])
df.to_csv("data_chunk_"+i, sep="|", index=False)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5632 次 |
| 最近记录: |