You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Dask实现类似Pandas按country分组生成DataFrame字典?

Dask实现按分组生成DataFrame字典(替代Pandas分组逻辑)

你需要的功能可以通过基于唯一值筛选+延迟计算的方式实现,不用把整个超大数据集加载到内存(避免df.compute()的内存压力),具体步骤如下:

  1. 读取超大CSV文件:
import dask.dataframe as dd

# Dask会自动对文件分区,无需全量加载到内存
df = dd.read_csv("your_large_file.csv")
  1. 获取所有唯一的country值(仅计算少量数据,内存开销极小):
# 仅提取分组键的唯一值,compute操作不会处理全量数据
unique_countries = df['country'].unique().compute()
  1. 生成分组后的Dask DataFrame字典:
# 对每个country用布尔索引筛选对应行,并移除country列
grouped_dfs = {
    country: df[df['country'] == country].drop(columns=['country'])
    for country in unique_countries
}

关键说明:

  • 字典中的每个元素都是Dask DataFrame,所有操作均为延迟执行,不会立即占用内存。
  • 若需处理单个分组数据,仅需对该分组执行compute(),比如grouped_dfs['China'].compute(),只会加载对应分组的数据,而非全量文件。
  • 要将每个分组保存为独立文件,可直接用Dask的to_csv(支持分块写入,无需全量加载):
for country, ddf in grouped_dfs.items():
    # single_file=True确保每个分组生成一个单独的CSV文件
    ddf.to_csv(f"{country}_subset.csv", single_file=True, index=False)

为什么不直接用Dask groupby迭代?

Dask的groupby是为聚合操作(如sum、mean)优化的,直接迭代每个分组需要对全量数据进行跨分区shuffle,对于超大文件来说会带来极高的IO和内存开销。而布尔索引方式可以利用Dask的分区特性高效筛选数据,避免不必要的shuffle,更适合TB级大文件的处理。

内容的提问来源于stack exchange,提问作者user1717931

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 07:47:04