2016-09-22 22 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()