2016-09-22 24 views
2

假设我们有一个列表的熊猫系列,其中每个列表包含描述字符串这样一些特点:创建基于熊猫系列列表的2D情节像素网格

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

什么是最好/最简单绘制二维像素网格的方式,其中X轴是特征的出现点,Y轴是系列0,1,2,...,N中的每个样本。

编辑在16年9月22日:

我似乎没有明确提到的特性列表不一定对所有的意见相同的大小。观察1可以有4个特征,观察2可以没有,观察3可以有5个等。因此,我无法立即将它们转换为一个不规则的数组,而无需以某种方式对它们进行预处理,以弥补缺失的特征。

+0

你有没有想过将其转换为numpy的矩阵,然后使用matplotlib做你想做什么?请包括你的方法来解决问题。 – Kartik

+0

在这里拍摄黑暗中的照片,但是你在寻找[像这样的2D像素网格](http://i.stack.imgur.com/N5HPE.png)?如果没有,请详细说明你想要的是什么,对于我来说,有一个2D坐标图出现为一个坐标轴并没有什么意义。 – lanery

+0

我认为真正的问题是首先以列表的形式转换矩阵列表中的要素。请注意,该系列中的观察值不一定相同。它类似'pandas.get_dummies()',但是这种方法基于单个列的标量值提取矩阵,而不是单列中列表中的值。 – srodriguex

回答

3

因为我已经在我的评论写的图像的代码,和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() 

enter image description here

+0

几乎在那里。正如我在编辑问题之后解释的那样,我没有预先设定完美的MxN矩阵,其中有M个观察值和N个特征。我有一个M个观察列表,其中每个观察列表都有一个N个特征的列表。 – srodriguex

+0

我想出了如何使用'sklearn]'(http://scikit-learn.org/)的'CountVectorizer'特征提取来将M个观测值列表转换为M列特征列表。一旦完成,这个问题就可以通过这个答案来解决。 – srodriguex

+0

太棒了,很高兴它为你工作!并且请记住,如果您必须添加到我的答案中,您可以考虑添加自己的答案。 – lanery

1

使用熊猫作为一维函数似乎是直截了当的,如在this的答案。你可以使用这个概念,并通过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()