如何将列表赋值为Dask-Dataframe列 解决不支持list类型赋值报错
问题原因
Dask DataFrame不支持直接将Python原生列表赋值为新列,作为分布式计算框架,Dask的列数据需要适配分区并行的处理逻辑,直接传入本地列表无法被正确分区映射,因此会抛出Column assignment doesn't support type list报错。
解决方法
以下两种方案均可实现嵌套列表赋值为新列的需求,需保证你的嵌套列表长度和Dask DataFrame的行数完全一致、顺序完全对齐。
方案1:小数据量场景(本地内存可放下全量列表)
先将嵌套列表转为Pandas Series,再转为和原Dask DataFrame分区数一致的Dask Series后赋值:
import dask.dataframe as dd import pandas as pd # 你的嵌套列表 nested_list = [ ["2005/01/01","2005/01/02","2005/01/03"], ["2005/05/01","2005/05/02"], ["2005/06/01","2005/06/02","2005/06/03"] ] # 假设现有Dask DataFrame名为ddf # 1. 嵌套列表转Pandas Series pd_time_series = pd.Series(nested_list, name="time") # 2. 转Dask Series,分区数和原ddf保持一致 dd_time_series = dd.from_pandas(pd_time_series, npartitions=ddf.npartitions) # 3. 赋值新列 ddf = ddf.assign(time=dd_time_series)
方案2:大数据量场景
将嵌套列表按原Dask DataFrame的分区规则切分,通过map_partitions给每个分区单独赋值:
# 1. 计算原ddf每个分区的行数 partition_lengths = ddf.map_partitions(len).compute().tolist() # 2. 按分区行数切分嵌套列表 split_nested_list = [] cursor = 0 for part_len in partition_lengths: split_nested_list.append(nested_list[cursor:cursor+part_len]) cursor += part_len # 3. 自定义分区处理函数 def add_time_column(partition_df, list_part): partition_df["time"] = list_part return partition_df # 4. 应用到所有分区,指定新的meta结构 ddf = ddf.map_partitions( add_time_column, split_nested_list, meta=ddf.meta.to_list() + [("time", "object")] )
注意事项
- 嵌套列表作为列存储时,数据类型为object,若后续需要对列表内的日期做计算,建议提前将列表内的字符串转为datetime类型
- 若嵌套列表是通过Dask内部逻辑生成的,尽量直接在
map_partitions内部完成生成和赋值,不要先拉取到本地内存再回写,避免OOM
内容的提问来源于stack exchange,提问作者LOL
相关产品推荐
相关产品推荐

