使用Dask实现多目标列的数据表透视转换求助
解决Dask中对
t*列进行宽表转长表的问题 问题场景
现有Dask DataFrame结构如下:
date col1 col2 t1 t2 t3 col3 12 23.2 23.2 100 200 300 1 13 34.2 12.2 10 223 122 2 14 32 12 10 20 100 3
需要将所有匹配t*的列转换为t_day和t_val列,得到目标格式:
date col1 col2 t_day t_val col3 12 23.2 23.2 1 100 1 12 23.2 23.2 2 200 1 12 23.2 23.2 3 300 1 13 34.2 12.2 1 10 2 13 34.2 12.2 2 223 2 13 34.2 12.2 3 122 2 14 32 12 1 10 3 14 32 12 2 20 3 14 32 12 3 100 3
之前尝试的代码因Dask不支持unstack()报错:
AttributeError: 'DataFrame' object has no attribute 'unstack'
可行解决方案
核心问题是Dask不支持extractall()返回结果的unstack()操作,我们可以改用str.extract()直接提取t后面的数字,无需处理多层索引。完整代码如下:
# 筛选所有以t开头的列 target_features = [col for col in data.columns if col.startswith('t')] pivoted_df = ( data.melt( id_vars=data.columns.difference(target_features), # 保留非t*的列作为id变量 value_vars=target_features, # 指定要转换的t*列 var_name='t_day', value_name='t_val' ) .assign( # 直接提取t后面的数字并转为整数 t_day=lambda d: d['t_day'].str.extract(r't(\d+)').astype(int) ) )
代码说明
melt操作:将宽表转为长表,id_vars保留不需要转换的列,value_vars指定要拆分的t*列,生成t_day(原列名)和t_val(原列值)两列。- 提取
t_day的数字:用str.extract(r't(\d+)')直接捕获t后面的数字,返回单个列,直接转为整数即可,避免了extractall()带来的多层索引问题,完全兼容Dask的操作。
这个方案可以正确生成你需要的目标格式,且完全适配Dask的分布式处理特性。
内容的提问来源于stack exchange,提问作者Obiii
相关产品推荐
相关产品推荐

