Pandas如何将指定列转为行 拆分价格、交易量为独立列
解答
你选择melt的方向没有问题,但直接将价格、交易量列全部传入value_vars,会把两类不同的度量值合并到同一列,无法满足拆分独立列的要求。针对这类「同一分类维度下对应多个度量字段」的宽表转长表场景,使用pandas.wide_to_long实现效率最高,无需多次转换拼接。
推荐实现方案(wide_to_long)
wide_to_long可以自动识别列名的结构,将同层级的不同度量值拆分到独立列,同时提取层级标识:
result = pd.wide_to_long( df, stubnames = ['price', 'vol'], # 拆分后保留的度量列名,对应列名的后缀部分 i = ['uid', 'location'], # 固定不拆分的行标识列 j = 'unit_level', # 存储层级标识的新列名 sep = '_', # 列名中前缀、后缀的分隔符 suffix = r'\w+' # 匹配后缀的规则 ).reset_index()
运行后unit_level列的取值自动为unit1/unit2/unit3,price列存储对应层级价格,vol列存储对应层级交易量,完全匹配预期结构。
基于melt的实现方案
如果要使用你最初尝试的melt方法,需要分别对价格、交易量列做两次融合,处理后再按主键合并:
# 融合价格列 melt_price = df.melt( id_vars=['uid', 'location'], value_vars=[col for col in df.columns if col.endswith('_price')], var_name='unit_level', value_name='price' ) melt_price['unit_level'] = melt_price['unit_level'].str.replace('_price', '') # 融合交易量列 melt_vol = df.melt( id_vars=['uid', 'location'], value_vars=[col for col in df.columns if col.endswith('_vol')], var_name='unit_level', value_name='vol' ) melt_vol['unit_level'] = melt_vol['unit_level'].str.replace('_vol', '') # 合并得到最终结果 result = melt_price.merge(melt_vol, on=['uid', 'location', 'unit_level'])
内容的提问来源于stack exchange,提问作者IamWarmduscher
相关产品推荐
相关产品推荐

