Pandas Dataframe列表展开、值统计及热力图生成问题求助
解决方案
步骤1:统一数据格式
首先需要将list列的所有条目转换为标准列表格式,处理其中的字符串型条目:
import pandas as pd from collections import Counter import seaborn as sns import matplotlib.pyplot as plt # 构造示例数据集 data = { 'id': [1, 2, 3, 4, 5], 'list': [['a', 'b'], ['a', 'a', 'a', 'b'], 'c,b,b', ['c', 'a'], ['f', 'f', 'b']] } df = pd.DataFrame(data) # 统一转换为列表 def normalize_list(x): if isinstance(x, str): return x.split(',') return x df['list'] = df['list'].apply(normalize_list)
步骤2:计算共现与自现矩阵
遍历每个列表,统计元素出现频次,通过频次乘积的累加得到最终的统计矩阵:
# 定义所有目标取值 all_values = ['a', 'b', 'c', 'd', 'e', 'f'] # 初始化全零统计矩阵 co_occur_matrix = pd.DataFrame(0, index=all_values, columns=all_values) # 遍历每个列表更新矩阵 for lst in df['list']: count = Counter(lst) # 计算所有元素对的频次乘积并累加 for val1 in all_values: for val2 in all_values: co_occur_matrix.loc[val1, val2] += count.get(val1, 0) * count.get(val2, 0)
步骤3:生成热力图
使用seaborn绘制热力图展示统计结果:
plt.figure(figsize=(8, 6)) sns.heatmap(co_occur_matrix, cmap='RdYlGn_r', linewidths=0.5, annot=True, fmt="d") plt.title('Value Co-occurrence & Self-occurrence Heatmap') plt.show()
结果说明
- 对角线单元格:对应值的自现累计统计,即每个列表中该值出现次数的平方之和(比如id2中a出现3次,贡献9到a-a的统计值)。
- 非对角线单元格:对应两个值的共现累计统计,即每个列表中两个值出现次数的乘积之和(比如id1中a、b各出现1次,分别给a-b和b-a各加1)。
- 未出现的组合(如d与任何值的组合)统计值保持为0。
内容的提问来源于stack exchange,提问作者Shannah
相关产品推荐
相关产品推荐

