获取列表唯一标签并合并多组数据为DataFrame用于Seaborn绘图
问题描述
现有多组label与value对应列表:
label = [0, 2, 1, 3, 4, 9, 8, 24, 86, 5] value = [103, 16, 10, 9, 5, 4, 4, 3, 3, 3] label1 = [0, 2, 3, 1, 9, 15, 4, 6, 5, 23] value1 = [73, 14, 8, 7, 3, 3, 3, 2, 2, 2] label2 = [0, 2, 1, 3, 9, 6, 10, 15, 4, 114] value2 = [48, 11, 7, 6, 3, 2, 2, 2, 2, 1]
需要将所有唯一label作为DataFrame的单列,合并各组value数据,对应label不存在的位置填充0,最终用于Seaborn的scatterplot/pairplot绘图,也可接受直接绘制原始数据的方案。
解决方案
方法一:构建目标格式DataFrame
通过字典映射和去重处理,生成符合要求的宽格式DataFrame:
import pandas as pd # 定义原始数据 label = [0, 2, 1, 3, 4, 9, 8, 24, 86, 5] value = [103, 16, 10, 9, 5, 4, 4, 3, 3, 3] label1 = [0, 2, 3, 1, 9, 15, 4, 6, 5, 23] value1 = [73, 14, 8, 7, 3, 3, 3, 2, 2, 2] label2 = [0, 2, 1, 3, 9, 6, 10, 15, 4, 114] value2 = [48, 11, 7, 6, 3, 2, 2, 2, 2, 1] # 将每组label-value转为字典,方便快速映射 group0 = dict(zip(label, value)) group1 = dict(zip(label1, value1)) group2 = dict(zip(label2, value2)) # 收集所有唯一label并保持原始出现顺序(Python3.7+字典有序) all_unique_labels = list(dict.fromkeys(label + label1 + label2)) # 构建目标DataFrame df = pd.DataFrame({'label': all_unique_labels}) df['value'] = df['label'].map(group0).fillna(0).astype(int) df['value1'] = df['label'].map(group1).fillna(0).astype(int) df['value2'] = df['label'].map(group2).fillna(0).astype(int) # 查看结果 print(df)
输出结果与需求一致,可直接用于Seaborn绘图。
方法二:直接使用原始数据绘图
无需合并填充,将原始数据整理为长格式后直接绘制,更适合scatterplot:
import seaborn as sns import matplotlib.pyplot as plt # 整理为长格式数据 plot_data = [] # 添加第一组数据 for l, v in zip(label, value): plot_data.append({'label': l, 'value': v, 'group': '组1'}) # 添加第二组数据 for l, v in zip(label1, value1): plot_data.append({'label': l, 'value': v, 'group': '组2'}) # 添加第三组数据 for l, v in zip(label2, value2): plot_data.append({'label': l, 'value': v, 'group': '组3'}) df_long = pd.DataFrame(plot_data) # 绘制散点图 sns.scatterplot(data=df_long, x='label', y='value', hue='group') plt.title('各组label-value散点图') plt.show() # 若需绘制pairplot,使用方法一生成的宽格式DataFrame即可 sns.pairplot(df[['value', 'value1', 'value2']]) plt.show()
内容的提问来源于stack exchange,提问作者Casey Nwandu
相关产品推荐
相关产品推荐

