【问题标题】:Is there a way to save large panda data in multiple (parquet/csv) files as Pyspark does?有没有办法像 Pyspark 那样将大熊猫数据保存在多个(parquet/csv)文件中?
【发布时间】:2020-01-16 13:03:42
【问题描述】:

我有大熊猫数据框,我需要将其保存到多个 (parquet/csv) 文件中以减少文件的卷空间。

我可以通过将数据框划分为多个数据框并分别保存来进行划分

有没有办法直接做到这一点?

【问题讨论】:

  • 据我所知,Pandas 中没有这样的方法。恕我直言,你可以从Daskto_parquet

标签: pandas csv parquet


【解决方案1】:

这是我经常使用的一个简单函数:

def df_to_parquets(df, chunk_size=10):
    """
    Saves pandas dataframe to parquet in chunks
    """
    
    grp = df.groupby(df.index // chunk_size)
    for index, (name, group) in enumerate(grp):
        group.to_parquet(f'file_{index}.gzip', compression='gzip')

样本数据

df = pd.DataFrame(np.random.rand(10, 5), columns = ['col_'+str(x) for x in range(1, 6)])

df_to_parquets(df, chunk_size=2)

这将输出 5 个不同的拼花文件。

【讨论】:

  • for循环不应该超出范围(chunk_size)吗?
  • @jjet 为什么是块大小?
  • 我只是在尝试您的功能,但它对我来说不太奏效。假设您的 df 有一百万行并且您设置 chunk_size = 10000。然后,n_grp 将为 100,但每个 grp.nth(i) 将只有 100 行。用 chunk_size 替换 for 循环中的 n_grp 解决了这个问题(尽管对 chunk_size 的解释并不理想)
  • 非常感谢您的回答,尽管代码中有错误:grouped.nth(i) 没有得到第 i 个组,而是每个组的第 i 个第一个元素 pandas doc=> @jjet 的评论。如果您遍历 grp.groups 并使用 counter 命名文件,它工作正常。
猜你喜欢
  • 2021-09-23
  • 2019-06-05
  • 1970-01-01
  • 2021-06-01
  • 1970-01-01
  • 2019-10-16
  • 2020-07-04
  • 2019-05-21
  • 1970-01-01
相关资源
最近更新 更多