如何将字典中各列表的每个值存入独立列?用于桑基图分析
实现用户点击行为的列格式转换(用于桑基图分析)
原始数据
用户拥有如下结构的字典,键为用户标识,对应值为点击行为列表:
my_dict = { 1: ['Home', 'Stories'], 2: ['Sounds', 'Stories', 'Home', 'Home', 'Stories'], 3: ['Journeys', 'Journeys', 'Journeys '], 4: ['Home', 'Home', 'Home'], 5: ['Home', 'Stories', 'Home', 'Home', 'Cancellation Flow'], 6: ['My Account', 'My Account'] }
需求
需要将每个用户的点击行为列表拆分为独立列,输出如下格式的结构化数据(用于制作桑基图分析用户点击决策组合):
User 1 2 3 4 5 1 'Home' 'Stories' 2 'Sounds' 'Stories' 'Home' 'Home' 'Stories' 3 'Journeys' 'Journeys' 'Journeys' 4 'Home' 'Home' 'Home' 5 'Home' 'Stories' 'Home' 'Home' 'Cancellation Flow' 6 'My Account' 'My Account'
实现方法
方法一:使用Pandas(推荐,适配后续桑基图数据处理)
Pandas可快速将字典转换为结构化DataFrame,自动补全缺失值,最后格式化输出:
import pandas as pd # 将字典转为DataFrame,用户ID作为索引 df = pd.DataFrame.from_dict(my_dict, orient='index') # 重命名列,从1开始编号 df.columns = [str(i) for i in range(1, len(df.columns)+1)] # 添加User列,将索引转为列 df.reset_index(inplace=True) df.rename(columns={'index': 'User'}, inplace=True) # 格式化输出,设置列宽与对齐方式 print(df.to_string(na_rep='', col_space=[8, 18, 18, 18, 10, 25], justify='left'))
生成的DataFrame可直接作为桑基图的数据源(比如用plotly或matplotlib绘图时,可直接调用列数据)。
方法二:纯Python实现(手动控制格式)
无需第三方库时,可通过字符串对齐手动生成目标格式:
# 确定最长点击列表的长度,以此设置总列数 max_len = max(len(lst) for lst in my_dict.values()) # 定义表头:User + 1到max_len的序号 headers = ['User'] + [str(i) for i in range(1, max_len+1)] # 定义每列宽度(可根据内容调整) col_widths = [8, 18, 18, 18, 10, 25] # 打印表头 header_line = ''.join(f'{header:<{col_widths[i]}}' for i, header in enumerate(headers)) print(header_line) # 逐行打印用户数据 for user_id, clicks in my_dict.items(): # 给点击行为添加引号,不足的列补空字符串 row_data = [str(user_id)] + [f"'{click}'" for click in clicks] + ['']*(max_len - len(clicks)) # 格式化每行内容 row_line = ''.join(f'{data:<{col_widths[i]}}' for i, data in enumerate(row_data)) print(row_line)
内容的提问来源于stack exchange,提问作者Sophie Martusewicz
相关产品推荐
相关产品推荐

