如何使用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
相关产品推荐
相关产品推荐

