基于 pandas 系列列表创建二维绘图像素网格

Create a 2D plot pixel grid based on a pandas series of lists

假设我们有一个 pandas 系列列表,其中每个列表包含一些描述为字符串的特征,如下所示:

0  ["A", "C", "G", ...]
1  ["B", "C", "H", ...]
2  ["A", "X"]
...
N  ["J", "K", ...]

绘制二维像素网格的 best/easiest 方法是什么,其中 X 轴是特征的出现,Y 轴是系列 0,1,2,..., N 中的每个样本?

16 月 22 日编辑:

我似乎没有明确提到特征列表不一定对所有观察具有相同的大小。观察 1 可以有 4 个特征,观察 2 可以没有一个,观察 3 可以有 5 个,依此类推。因此,如果不以某种方式对它们进行预处理以填充缺失的特征,我无法立即将它们转换为 numpy 数组。

使用 pandas 一维直方图似乎很简单,如 答案。您可以使用这个想法并用 26 填充 N 的数组,然后使用

在 2D 中绘制
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import random
import string
from collections import Counter

#Generate list of letters and dataframe
N = 20
M = 1000
letterlist = []
for i in range(N):
    letterlist.append([random.choice(string.ascii_uppercase) for i in range(M)])
df = pd.DataFrame(letterlist)

#Fill an array of size N by 26
im = np.zeros([N,26])
for n in range(N):
    #Get histogram of letters for a line as Dict
    letter_counts = Counter(df.loc[n])
    #Add to array
    for k in letter_counts.keys():
        c = ord(k.lower()) - 97
        im[n,c] = letter_counts[k]

#Plot
plt.imshow(im, interpolation='none')
plt.colorbar()
plt.axis('tight')
plt.xticks(range(26), [i for i in string.ascii_uppercase])
plt.show()

因为我已经在我的评论中写下了图像的代码,而且 Ed 似乎和我对你的问题有相同的解释,我将继续添加我的解决方案。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import string

M, N = 100, 10
letters = list(string.ascii_uppercase)
data = np.random.choice(letters, (M, N))

df = pd.DataFrame(data)
# Get frequency of letters in each column using pd.value_counts
df_freq = df.apply(pd.value_counts).T

# Plot frequency dataframe with seaborn heatmap
ax = sns.heatmap(df_freq, linewidths=0.1, annot=False, cbar=True)
plt.show()