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

如何使用pandas melt函数拆分房屋设施列表实现逐行输出

问题解决方法

原代码错误点

  • 拆分inside字段时仅保留了拆分后的设施列,丢失了原数据行对应的hostid、location_id关联关系
  • 重复调用melt函数导致数据逻辑错乱,误将行索引当作hostid赋值,未关联原表的真实字段值

按要求使用melt函数的实现代码

import pandas as pd
import ast

# 原始数据构造
d = {'hostid': [1, 1, 2], 
     'inside': ['["Coffe", "Shampoo", "Parking"]', 
                '["Coffe", "Hair dryer"]', 
                '["Parking", "Shampoo", "TV"]'], 
     'location_id': [100, 101, 200]}
df = pd.DataFrame(data=d)

# 把JSON格式的inside字段转成列表,比手动替换字符更稳妥,不会出现多余空格问题
df['inside'] = df['inside'].apply(ast.literal_eval)
# 将列表拆分为多列
split_inside = df['inside'].apply(pd.Series)
# 合并原表的hostid、location_id字段
merge_df = pd.concat([df[['hostid', 'location_id']], split_inside], axis=1)

# 用melt实现行转列,保留hostid和location_id为固定字段
res = merge_df.melt(id_vars=['hostid', 'location_id'], value_name='inside')
# 清理空值、无用列、多余空格,按原顺序排序后重置索引
res = res.dropna(subset=['inside']).drop(columns='variable')
res['inside'] = res['inside'].str.strip()
res = res.sort_values(['hostid', 'location_id']).reset_index(drop=True)

运行输出结果:

hostid  location_id      inside
0       1          100       Coffe
1       1          100     Shampoo
2       1          100     Parking
3       1          101       Coffe
4       1          101  Hair dryer
5       2          200     Parking
6       2          200     Shampoo
7       2          200          TV

更简洁的替代实现(无需melt)

如果不限制必须使用melt函数,用pandas内置的explode方法可以一步完成拆分:

import pandas as pd
import ast

d = {'hostid': [1, 1, 2], 
     'inside': ['["Coffe", "Shampoo", "Parking"]', 
                '["Coffe", "Hair dryer"]', 
                '["Parking", "Shampoo", "TV"]'], 
     'location_id': [100, 101, 200]}
df = pd.DataFrame(data=d)

df['inside'] = df['inside'].apply(ast.literal_eval)
res = df.explode('inside').reset_index(drop=True)

运行结果和上述melt实现完全一致。

内容的提问来源于stack exchange,提问作者Mr. Hankey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 07:45:04