按大小拆分数据帧,Python3.6

2024-04-16 09:31:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我想把数据帧分成30MB不同的数据集。然后我需要导出到csv文件。在

FileSize = SQLData.memory_usage(index=True, deep=False).sum())
FileSizeMB = FileSize/1038336
if FileSizeMB > 30:
  # Want to split data frame below 30MB.
  # Export splitted Dataframe
else:
    SQLData.to_csv(r'D:\Export\SQLData.csv', sep=',', index=False, na_rep='NA')

这可能吗?在


Tags: 文件csvto数据falsetrueindexusage
1条回答
网友
1楼 · 发布于 2024-04-16 09:31:15

尝试以下递归解决方案:

# solution
def save_file_part(df, size_threshold, save_path, part_number=0):
    file_size = df.memory_usage(index=True, deep=False).sum() / 1038336
    num_records = len(df)

    if file_size > size_threshold:
        records_to_split_off = int(num_records * size_threshold // file_size)
        df_to_save = df.head(records_to_split_off)
        df_to_save.to_csv(save_path.format(part_number),sep=',', index=False, na_rep='NA')
        save_file_part(df.tail(num_records-records_to_split_off), size_threshold, save_path, part_number=part_number+1)

    else:
        df.to_csv(save_path.format(part_number), sep=',', index=False, na_rep='NA')


# example
dates = pd.date_range('20130101',periods=60000)
df = pd.DataFrame(np.random.randn(60000,4),index=dates,columns=list('ABCD'))
file_size = df.memory_usage(index=True, deep=False).sum() / 1038336
print(file_size)

save_file_part(df, 0.5, save_path="c:/tmp/my_df_{}.csv") # note, the function expects "save_path" as a string with at least one "{}" placeholder

在df.memory_用法告诉您pandas数据帧在内存中的大小。当您保存csv时,大小会有所不同(会更大),因此您可能需要将size_threshold设置为15 Mb左右。你可以用一个脚本计算出一个合适的大小,但是你也可以尝试一下,找到正确的比例

相关问题 更多 >