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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 03:24:25